问题描述
使用matlibplot.pyplot中的axes.bar()作图后x轴是默认排序的,这其实打乱了我一开始数据中的排序,是我不想要的,我想要的是x轴按照我数据中的原始顺序排序。import matplotlib.pyplot as plt
In [1]:df2_b
Out[1]:
项目建设周期
<0天 10
0天 6657
1个月 18936
2个月 6279
3个月 8166
4个月 3468
5个月 2862
6个月 1952
7个月 1513
8个月 574
9个月 449
10个月 434
11个月 20
12个月 1
一年以上 18
Name: 项目定义, dtype: int64
In [2]:type(df2_b)
Out[2]: pandas.core.series.Series
上面是引入模块和数据描述
In [3]: fig=plt.figure(figsize=(10,5))
...: axes=fig.add_subplot(1,1,1)
...: axes.bar(df2_b.index,df2_b)
Out[3]: <Container object of 15 artists>
看到没,这与我上面数据的排序是不一致的,因为它默认就是自动按照数字顺序排序的
错误的解决方法
使用axes.set_xticks和axes.set_xticklabels的方法设置刻度位置和刻度标签,而且无论在画图前还是画图后设置结果都是一样的。画图前设置:
In [4]: fig=plt.figure(figsize=(10,5))
...: axes=fig.add_subplot(1,1,1)
...: axes.set_xticks(np.arange(len(df2_b)))
...: axes.set_xticklabels(df2_b.index)
...: axes.bar(df2_b.index,df2_b)
Out[4]: <Container object of 15 artists>
画图后设置:
In [5]: fig=plt.figure(figsize=(10,5))
...: axes=fig.add_subplot(1,1,1)
...: axes.bar(df2_b.index,df2_b)
...: axes.set_xticks(np.arange(len(df2_b)))
...: axes.set_xticklabels(df2_b.index)
Out[5]:
[Text(0,0,'<0天'),
Text(0,0,'0天'),
Text(0,0,'1个月'),
Text(0,0,'2个月'),
Text(0,0,'3个月'),
Text(0,0,'4个月'),
Text(0,0,'5个月'),
Text(0,0,'6个月'),
Text(0,0,'7个月'),
Text(0,0,'8个月'),
Text(0,0,'9个月'),
Text(0,0,'10个月'),
Text(0,0,'11个月'),
Text(0,0,'12个月'),
Text(0,0,'一年以上')]
说明:这里的set_xticks不进行设置也可以
问题说明:眼尖的可能会发现,这里改的是标签,但是数据并没有相应的更改,<0天这项数据没有这么大。出现这个问题的原因是axes.bar的参数
axes.bar(left = (0.2,1),height = (1,0.5),width = 0.2)
这里的bar的 第一个参数表示的是开始的位置,所以它才会对x轴排序,就是为了得到一系列类似于“1,2,3,4”的位置信息,height表示条形图的高度,wdith表示条形图的宽度,避免太宽或太窄。所以这里的默认排序改变不了,只能添加合理的left才行
真正的解决方法
使用df2_b.index的序列号作为left位置,这样就能保证不会重排,然后再添加x轴标签。In [6]: fig=plt.figure(figsize=(10,5))
...: axes=fig.add_subplot(1,1,1)
...: axes.bar(np.arange(len(df2_b)),df2_b)
...: axes.set_xticks(np.arange(len(df2_b)))
...: axes.set_xticklabels(df2_b.index)
Out[6]:
[Text(0,0,'<0天'),
Text(0,0,'0天'),
Text(0,0,'1个月'),
Text(0,0,'2个月'),
Text(0,0,'3个月'),
Text(0,0,'4个月'),
Text(0,0,'5个月'),
Text(0,0,'6个月'),
Text(0,0,'7个月'),
Text(0,0,'8个月'),
Text(0,0,'9个月'),
Text(0,0,'10个月'),
Text(0,0,'11个月'),
Text(0,0,'12个月'),
Text(0,0,'一年以上')]