这会给出确切的所希望的描绘:
import matplotlib.pyplot as plt
from collections import OrderedDict
T_OLD = {'10' : 'need1', '11':'need2', '12':'need1', '13':'need2','14':'need1'}
T_SRT = OrderedDict(sorted(T_OLD.items(), key=lambda t: t[0]))
plt.plot(map(int, T_SRT.keys()), map(lambda x: int(x[-1]), T_SRT.values()),'r')
plt.ylim([0.9,2.1])
ax = plt.gca()
ax.set_yticks([1,2])
ax.set_yticklabels(['need1', 'need2'])
plt.title('T_OLD')
plt.xlabel('time')
plt.ylabel('need')
plt.show()
对于Python 3.X的密谋线需要的map()
输出到列表中显式转换:
plt.plot(list(map(int, T_SRT.keys())), list(map(lambda x: int(x[-1]), T_SRT.values())),'r')
如在Python 3 .X map()
返回一个迭代器,而不是Python 2.7中的列表。
该图使用将字典键转换为整数,并将最后一个元素need1
或need2
转换为整数。这依赖于您的数据的特定结构,如果其中need1
和need3
的值需要多个操作。
在绘制和更改轴限制之后,程序只是修改y位置1和2的刻度标签。然后它会添加标题和x和y轴标签。
重要的部分是字典/输入数据必须排序。一种方法是使用OrderedDict
。这里T_SRT
是按T_OLD
中的键排序的OrderedDict
对象。
的输出是:
这对于在T_OLD
多个值/标签更一般的情况。它假设标签始终为'needX'
,其中X
是任意数字。这可以很容易地做了虽然这将需要更多的处理的数量之前的任何串的一般情况下,
import matplotlib.pyplot as plt
from collections import OrderedDict
import re
T_OLD = {'10' : 'need1', '11':'need8', '12':'need11', '13':'need1','14':'need3'}
T_SRT = OrderedDict(sorted(T_OLD.items(), key=lambda t: t[0]))
x_val = list(map(int, T_SRT.keys()))
y_val = list(map(lambda x: int(re.findall(r'\d+', x)[-1]), T_SRT.values()))
plt.plot(x_val, y_val,'r')
plt.ylim([0.9*min(y_val),1.1*max(y_val)])
ax = plt.gca()
y_axis = list(set(y_val))
ax.set_yticks(y_axis)
ax.set_yticklabels(['need' + str(i) for i in y_axis])
plt.title('T_OLD')
plt.xlabel('time')
plt.ylabel('need')
plt.show()
此溶液发现的数量在使用re.findall
标签的端部,以适应的多的可能性数字号码。以前的解决方案只是采用了字符串的最后一个部分,因为数字是单个数字它仍然假定绘制位置的数字是字符串中的最后一个数字,因此是[-1]
。再次为Python 3.X地图输出显式转换为列表,在Python 2.7中不需要步骤。
标签现在通过以下方式生成:首先使用set
选择唯一的y值,然后通过将字符串'need'
与其对应的整数连接来重命名它们的标签。
y轴的极限值设置为最小值的0.9和最大值的1.1。其余格式与以前一样。
此测试情况下的结果是:
我想问你一两件事。如何为任何长度的字典编写代码。如果字典的长度是任意的,并且我们不想明确指定值(data_labels = ['need1','need2'])。 –
好的,看我更新的答案。 –