排序x轴值matplotlib直方图从最低到使用python
问题描述:
目前,我有一个脚本这使得下面的柱状图最高值:排序x轴值matplotlib直方图从最低到使用python
基于此数据:
{"first":"A","second":"1","third":"2"}
{"first":"B","second":"1","third":"2"}
{"first":"C","second":"2","third":"2"}
{"first":"D","second":"3","third":"2"}
{"first":"E","second":"3","third":"2"}
{"first":"F","second":"3","third":"2"}
{"first":"G","second":"3","third":"2"}
{"first":"H","second":"4","third":"2"}
{"first":"I","second":"4","third":"2"}
{"first":"J","second":"0","third":"2"}
{"first":"K","second":"0","third":"2"}
{"first":"L","second":"0","third":"2"}
{"first":"M","second":"0","third":"2"}
{"first":"N","second":"0","third":"2"}
这是呈现数据的直方图的代码:
with open('toy_two.json', 'rb') as inpt:
dict_hash_gas = list()
for line in inpt:
resource = json.loads(line)
dict_hash_gas.append({resource['first']:resource['second']})
# Count up the values
counts = collections.Counter(v for d in dict_hash_gas for v in d.values())
counts = counts.most_common()
# Apply a threshold
threshold = 4275
counts = [list(group) for val, group in itertools.groupby(counts, lambda x: x[1] > threshold) if val]
print(counts)
它被描绘这样的:
# Transpose the data to get the x and y values
labels, values = zip(*counts[0])
indexes = np.arange(len(labels))
width = 1
plt.bar(indexes, values, width)
plt.xticks(indexes + width * 0.5, labels)
plt.show()
的问题是,如何重新安排x轴,这样他们才能从低到高,即
0, 1, 3, 4
答
我想既然你已经使用matplotlib
,在pandas
中更好地进行数据处理。
In [101]: JSON = '''[{"first":"A","second":"1","third":"2"},
.....: {"first":"B","second":"1","third":"2"},
.....: {"first":"C","second":"2","third":"2"},
.....: {"first":"D","second":"3","third":"2"},
.....: {"first":"E","second":"3","third":"2"},
.....: {"first":"F","second":"3","third":"2"},
.....: {"first":"G","second":"3","third":"2"},
.....: {"first":"H","second":"4","third":"2"},
.....: {"first":"I","second":"4","third":"2"},
.....: {"first":"J","second":"0","third":"2"},
.....: {"first":"K","second":"0","third":"2"},
.....: {"first":"L","second":"0","third":"2"},
.....: {"first":"M","second":"0","third":"2"},
.....: {"first":"N","second":"0","third":"2"}]
.....: '''
In [102]: df = pd.read_json(JSON)
In [103]: df
Out[103]:
first second third
0 A 1 2
1 B 1 2
2 C 2 2
3 D 3 2
4 E 3 2
5 F 3 2
6 G 3 2
7 H 4 2
8 I 4 2
9 J 0 2
10 K 0 2
11 L 0 2
12 M 0 2
13 N 0 2
In [104]: df.groupby('second').size().plot(kind='bar')
Out[104]: <matplotlib.axes._subplots.AxesSubplot at 0x1104eac10>
条形图把你的类别以正确的顺序。
但如果你只需要一个通用的方法把你的酒吧订单,你可能只是建立一个临时的数据帧,排序,然后剧情:
In [109]: pd.DataFrame({'Labels': labels,
'Values': values}).sort_values(['Labels']).plot(kind='bar',
x='Labels',
y='Values',
width=1.0)
,但是,从实际数据集预处理很重要 - 因为它比玩具例子更大更复杂,所以 - 之后它不再是JSON格式。有数据通过预处理流水线后通过数据实现这一点吗? –
在这种情况下,您可以考虑构建一个临时数据框,按标签排序然后绘图。请参阅编辑。 –