基础篇:python数据可视化matplotlib的那些操作
应用篇:此篇
1. 绘制3D柱状图
效果展示:
1.1 绘制思路
-
导入3D绘图库
from mpl_toolkits.mplot3d import Axes3D
在任何绘制3D图形中,都会介绍这个库,但在实际应用中,似乎只需要在2D绘图的基础上加入
projection='3d'
。 -
确定x轴和y轴的坐标(1维)
该图是我预期的图形界面,先弄清自己x轴和y轴分别代表的是什么,相应的z轴对应的就是值。
-
通过np.meshgrid(X, Y)网格化坐标 (转换为2维)
在我理解meshgrid就是按另一个坐标系方向不断填充,因此z轴的形状与x,y相同。确定形状最好按如图所示的坐标轴方向画,不过也挺好记,因为与计算机读取图片的坐标轴一样。 -
确定z轴的值
-
调用ax.bar3d()绘制图片
其参数都需要是一维的,所以必须先扁平化(ravel)处理。
语文水平有限,在语言描述上不清楚,看代码可能更清晰。
1.2 代码展示
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
X = np.arange(0, 5) # X轴的坐标范围
Y = np.arange(0, 9) # Y轴的坐标范围
Z_list = []
for i in range(0, 9):
Z_list.append(np.ones(5) * i)
Z = np.array(Z_list)
print(Z.shape) # (9, 5)
xx, yy = np.meshgrid(X, Y) # 网格化坐标
X, Y = xx.ravel(), yy.ravel() # 矩阵扁平化 拉成一维向量
bottom = np.zeros_like(X) # 设置柱状图的底端位值
Z = Z.ravel() # 扁平化矩阵
width = height = 1 # 每一个柱子的长和宽
# 绘图设置
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
clr = plt.cm.jet(Z.ravel()/float(Z.max()))
ax.bar3d(X, Y, bottom, width, height, Z, shade=True, color=clr)
# 坐标轴设置
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z(value)')
# 保存和显示
plt.savefig('./plot_3d.png', dpi=400)
plt.show()
3D绘图参考链接
如何用Python绘制3D柱形图
python机器学习之3D Matplotlib绘图
python 画三维图像 曲面图和散点图
Python matplotlib 绘制3D柱形图
补充
使用Excel和matplotlib绘制3D折线图_Sunlight-程序员宅基地3D折线图
2. 对比图(双y绘制)
应用场景可以为分析一定时间内温度和湿度的变化曲线,横坐标为时间,纵坐标两个,分别为温度和湿度。温度和湿度的取值范围不一样,如果放在同一纵坐标下,一方的数据会被压缩得厉害,所以尝试在一张图上一个横坐标,两个纵坐标,同时也可以分析温度和湿度变化的关联性。
关键函数:
ax2 = ax.twinx()
2.1 实现效果
2.2 完整代码
# 导入库-------------------------------------
import numpy as np
import matplotlib.pyplot as plt
import random
from matplotlib import rc
rc('mathtext', default='regular')
# 准备数据-----------------------------------
time = np.arange(10) # [0, 10)
temperature = np.zeros(10)
for i in range(0, temperature.shape[0]):
temperature[i] = random.randint(10, 20)
humidity = np.zeros(10)
for i in range(0, humidity.shape[0]):
humidity[i] = random.randint(60, 80)
print(time, type(time)) # [0 1 2 3 4 5 6 7 8 9] <class 'numpy.ndarray'>
print(temperature, type(temperature)) # [18. 18. 10. 15. 16. 19. 11. 10. 15. 14.] <class 'numpy.ndarray'>
print(humidity, type(humidity)) # [60. 80. 69. 74. 73. 70. 67. 63. 75. 65.] <class 'numpy.ndarray'>
# 绘图--------------------------------------------------
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(time, temperature, '-', label='temperature')
ax2 = ax.twinx() # 关键是这个函数!
# lns2 = ax2.plot(time, humidity, '-', c='red', label='humidity')
ax2.scatter(time, humidity, c='red', label='humidity')
# print(type(lns2))
# 合并显示图例
fig.legend(loc=1, bbox_to_anchor=(1, 1), bbox_transform=ax.transAxes)
# 显示网格
ax.grid()
# 显示横纵坐标信息
ax.set_xlabel("Time (h)")
ax.set_ylabel(r"Temperature ($^\circ$C)")
ax2.set_ylabel(r"Radiation (%rh)")
# 保存图片
plt.savefig('0.png', dpi=400)
# plt.show()
参考链接:
1.双y轴绘制 关键函数:twinx()
matplotlib.axes.Axes.legend¶
3. 数据包含缺省值
背景说明:在包含缺省值的情况下,绘制出折线图,观察数据的变化趋势。
情况 | 解决方案 | 说明 |
---|---|---|
少量缺省值 | matplot中的plot()函数 | 针对零散的一些缺省值,该函数可以进行一个忽略。 |
大量缺省值 | 缺省值填充 | 比如填充为中值、众数、-1等 |
大量缺省值 | seaborn的lineplot函数 |
seaborn的应用高于matplot,且数据的格式为pandas格式,感觉seaborn是matplot的后代,pandas又是numpy的后代。
seaborn.lineplot(*, x=None, y=None, hue=None, size=None, style=None, data=None, palette=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, dashes=True, markers=None, style_order=None, units=None, estimator='mean', ci=95, n_boot=1000, seed=None, sort=True, err_style='band', err_kws=None, legend='auto', ax=None, **kwargs)
3.1 实现效果
先附上效果图,从图中可以看出,绿色的轴很多的点是缺失的,但是seaborn的lineplot可以忽略那些点,绘制出趋势图:
3.2 主要代码
这里附上之前写的代码,略微修改并附上说明:
def two_image_save(self, save_list1, save_list2, save_path):
# save_list1 数据1
# save_list2 数据2
# save_path 存储路径
fig = plt.figure()
ax1 = fig.add_subplot(111)
sns.set_palette("Blues_r") #颜色设置
save_data1 = pd.DataFrame(save_list1)
sns.lineplot(data=save_data1, legend=False, ax=ax1, markers=True)
# sns.scatterplot(data=save_data1, legend=False, ax=ax1)
ax2 = ax1.twinx() # 双y轴
save_data2 = pd.DataFrame(save_list2)
# palette = sns.color_palette("bright", len(save_list2))
sns.set_palette("Accent")
sns.lineplot(data=save_data2, legend=False, ax=ax2, markers=True)
# sns.scatterplot(data=save_data2, legend=False, ax=ax2)
plt.tight_layout()
plt.savefig(save_path, dpi=400)
4. 绘制3D散点图
散点图常适用于数据分析,散点图并没有柱状图那么复杂,你至于要提供x,y,z坐标就可以完成绘制。
ax.scatter(x坐标, y坐标, z坐标, label='标签名1')
主要x,y,z坐标需要维数相同的数据结构,如ax.scatter([1, 2, 3] [4, 5, 6], [7, 8, 9], label='标签名1')
绘制出来的点就是(1, 4,7),(2,5,8),(3,6,9)。
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')![在这里插入图片描述](https://img-blog.csdnimg.cn/e6955e82bb504259aae5666502852136.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5qmZ5qmZ5bCP54u454yr,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
ax.scatter(x坐标, y坐标, z坐标, label='标签名1')
ax.scatter(x坐标, y坐标, z坐标, label='标签名2')
plt.legend()
plt.show()
这次补充在pycharm下怎样绘制的三绘图实现旋转:
File -> Settings
Tools->Oython Scientific
取消勾选Show plots in tool window