python 数据可视化matplotlib的那些操作(二:应用实例)


基础篇:python数据可视化matplotlib的那些操作
应用篇:此篇

1. 绘制3D柱状图

效果展示:
在这里插入图片描述

1.1 绘制思路

  1. 导入3D绘图库

    from mpl_toolkits.mplot3d import Axes3D
    

    在任何绘制3D图形中,都会介绍这个库,但在实际应用中,似乎只需要在2D绘图的基础上加入projection='3d'

  2. 确定x轴和y轴的坐标(1维)
    在这里插入图片描述

    该图是我预期的图形界面,先弄清自己x轴和y轴分别代表的是什么,相应的z轴对应的就是值。

  3. 通过np.meshgrid(X, Y)网格化坐标 (转换为2维)
    在这里插入图片描述
    在我理解meshgrid就是按另一个坐标系方向不断填充,因此z轴的形状与x,y相同。确定形状最好按如图所示的坐标轴方向画,不过也挺好记,因为与计算机读取图片的坐标轴一样。

  4. 确定z轴的值

  5. 调用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)

seaborn.lineplot官网

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
在这里插入图片描述

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙橙小狸猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值