2017-09-16 355 views
0

目前,我有一个脚本这使得下面的柱状图最高值:排序x轴值matplotlib直方图从最低到使用python

enter image description here

基于此数据:

{"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 

回答

1

我想既然你已经使用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> 

enter image description here

条形图把你的类别以正确的顺序。

但如果你只需要一个通用的方法把你的酒吧订单,你可能只是建立一个临时的数据帧,排序,然后剧情:

In [109]: pd.DataFrame({'Labels': labels, 
         'Values': values}).sort_values(['Labels']).plot(kind='bar', 
            x='Labels', 
            y='Values', 
            width=1.0) 

enter image description here

+0

,但是,从实际数据集预处理很重要 - 因为它比玩具例子更大更复杂,所以 - 之后它不再是JSON格式。有数据通过预处理流水线后通过数据实现这一点吗? –

+0

在这种情况下,您可以考虑构建一个临时数据框,按标签排序然后绘图。请参阅编辑。 –