matlibplot.pyplot 画图 axes.bar() x轴默认排序解决方法

问题描述

使用matlibplot.pyplot中的axes.bar()作图后x轴是默认排序的,这其实打乱了我一开始数据中的排序,是我不想要的,我想要的是x轴按照我数据中的原始顺序排序。

import matplotlib.pyplot as plt
In [1]:df2_b
Out[1]: 
项目建设周期
<010
06657
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,'一年以上')]

结果图片

猜你喜欢

转载自blog.csdn.net/qq_35318838/article/details/80198307