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,'一年以上')]

结果图片

### 使用 `matplotlib.pyplot` 进行绘图 以下是通过 `matplotlib.pyplot` 库绘制图形的一些方法和示例代码: #### 示例 1:简单的折线图 以下是一个基本的折线图绘制示例,展示了如何创建并显示一条直线。 ```python import matplotlib.pyplot as plt # 数据准备 x = [1, 2, 3, 4, 5] y = [2, 4, 6, 8, 10] # 绘制折线图 plt.plot(x, y) # 显示图像 plt.show() ``` 这段代码定义了一组数据点 `(x, y)` 并调用了 `plot()` 函数来绘制这些点之间的连线[^1]。 --- #### 示例 2:带有标题和标签的折线图 为了使图表更具可读性,可以通过设置标题以及 X 和 Y 的标签来进行增强。 ```python import matplotlib.pyplot as plt import numpy as np # 数据生成 x = np.arange(0, 10, 1) y = x ** 2 # 绘制曲线 plt.plot(x, y) # 设置标题和坐标标签 plt.title("Square Curve") plt.xlabel("x-axis") plt.ylabel("y-axis") # 展示图像 plt.show() ``` 这里引入了 NumPy 来生成更复杂的数值序列,并设置了额外的信息以便更好地解释图表的内容[^2]。 --- #### 示例 3:带阴影的三维条形图 如果需要展示更加高级的效果,比如三维条形图,则可以利用 Matplotlib 的扩展工具包完成这一目标。 ```python import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 图像初始化 fig = plt.figure(figsize=(8, 3)) ax1 = fig.add_subplot(121, projection='3d') # 数据构建 _x = np.arange(4) _y = np.arange(5) _xx, _yy = np.meshgrid(_x, _y) x, y = _xx.ravel(), _yy.ravel() top = x + y bottom = np.zeros_like(top) width = depth = 1 # 绘制无阴影的柱状图 ax1.bar3d(x, y, bottom, width, depth, top, shade=False) ax1.set_title('No Shade') # 另一侧添加阴影版本 ax2 = fig.add_subplot(122, projection='3d') ax2.bar3d(x, y, bottom, width, depth, top, shade=True) ax2.set_title('With Shade') # 显示最终结果 plt.show() ``` 该例子说明了如何使用 `bar3d()` 方法制作立体化的直方图,并对比了开启与关闭阴影选项的不同视觉效果[^3]。 --- #### 示例 4:基础入门级线条样式调整 对于初学者来说,了解如何自定义线条的颜色、宽度以及其他属性是非常有用的技能之一。 ```python import matplotlib.pyplot as plt # 基础数据集 data = {'apple': 10, 'orange': 15, 'lemon': 5} names = list(data.keys()) values = list(data.values()) # 创建子图布局 fig, axs = plt.subplots(1, 3, figsize=(9, 3), sharey=True) # 不同类型的图表呈现方式 axs[0].bar(names, values) axs[1].scatter(names, values) axs[2].plot(names, values) # 整体外观优化 fig.suptitle('Categorical Plotting') # 输出至屏幕 plt.show() ``` 这个脚本演示了几种常见的二维统计表示形式——柱状图、散点图及连续型函数曲线图[^4]。 --- #### 总结 以上就是几个典型的基于 PyPlot 实现的数据可视化解方案。每一段程序都包含了必要的导入语句、核心逻辑处理部分以及最后一步渲染操作。可以根据实际需求选取合适的模板加以修改应用即可满足大多数场合下的分析汇报任务要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值