![8c9dc3315aca642f18c34f5f630c7652.png](https://i-blog.csdnimg.cn/blog_migrate/c5f88bb16b142546f3c3650598fdf4aa.jpeg)
上节课,基于Excel数据,利用Pandas和Matplotlib绘制出了温度随时间变化图。但是太单一了,数据可视化,是要从直观上去展现一些数据蕴涵的内在信息。
那么多属性,仅仅展现一个温度变化是远远不够的
能不能同时展示其他信息,用于进行直观的对比分析呢?答案是肯定的
分割画布利用子图进行数据展示
直接抛出问题,我们基于实际问题进行分析以及代码实现
问题:基于数据集,以可视化的方式对温湿度变化进行分析
拿到一个实际的项目(练手的顶多是问题,谈不上项目= =|||),我们可以从数据的输入、转化以及输出三方面着手去做。
- 数据的输入:利用Pandas读取,并选取要用到的属性数据
- 数据的转化:利用折线图看看效果,不明显了再调整方案
- 数据的输出:直接在画布上绘制,为了更好地展示,要对图表不断的进行优化
用到的函数:add_subplot()
知识点:在matplotlib中,整个画布是一个Figure对象,在Figure对象中可以包含一个或者多个Axes对象(也就是子图),每个子图都是一个拥有自己坐标系的绘图区域。
上代码上图,直观感受
数据的输入
df = pd.read_excel('D:PycharmProjectsData exercises数据可视化数据.xlsx')
x = df['时间']
y1 = df['温度']
y2 = df['湿度']
建立画布并将其分成两行一列的子区域,用于并行显示温度随时间变化以及湿度随时间变化
fig = plt.figure(facecolor = 'gray') # facecolor参数用于设置画布背景色,这里设置为灰色
ax1, ax2 = fig.subplots(2,1) # 画布被分为2行1列的两个子图区域
subplots()中的两个参数表明画布被划分了成了几行几列,这里被分成了2行1列,并将子图按顺序传给自变量ax1与ax2(“从左到右,由上到下去数”,即ax1表示第一行第一列的子图,ax2表示第二行第一列的子图)
ax1.plot(x, y1) # 将‘时间’和‘温度’属性对应的数据绘制在子图1中
ax2.plot(x, y2) # 同理,将‘时间’和‘湿度’属性对应的数据绘制在子图2中
plt.show()
上述代码,将不同数据传给不同的子图进行绘制就OK了。
![fa9ccea32190d8273fdd5fac7c4f0039.png](https://i-blog.csdnimg.cn/blog_migrate/c1a596d277745ece7906b1f971ca3486.jpeg)
从图上,我们大致可以分析出,地表传感器采集到的温度与湿度成反比关系(虽然数据少,但是结合我们当地气候以及经验,基本可以确定这个结论是符合实际情况的)
上图完整代码如下:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_excel('D:PycharmProjectsData exercises数据可视化数据.xlsx')
x = df['时间']
y1 = df['温度']
y2 = df['湿度']
fig = plt.figure()
ax1, ax2 = fig.subplots(2,1)
ax1.plot(x, y1)
ax2.plot(x, y2)
plt.show()
丑的不是一般,我要美美的图......继续优化~~~(这部分请参考第六课)
上下两个子图共用一个时间轴,所以没必要上下都显示刻度,这里可以去掉子图1的横轴刻度,找找看有没有啥方法啥函数能做到。
利用subplots()中的参数sharex和sharey分别控制所有子图共享X轴刻度和Y轴刻度
故,将代码
ax1, ax2 = fig.subplots(2,1)
改为
ax1, ax2 = fig.subplots(2,1, sharex = True)
出图如下,可以看到子图1的横轴刻度消失了
![4a78ccb61df31083f43bf5c2992a5cb9.png](https://i-blog.csdnimg.cn/blog_migrate/c8502d32bb583b3c1a029e851070b93b.png)
再按照上一课中,人为设置整个画布的长宽比以及坐标刻度旋转
fig = plt.figure(figsize = (13,4)) # 画布长宽比为13:4
plt.xticks(rotation = -20) #将X轴刻度逆时针旋转20度
得到如下图所示结果
![28387f35693a3a5ada3b2fdff5a47b11.png](https://i-blog.csdnimg.cn/blog_migrate/725e4019f8a125ff4fd4f49a799d8dd2.jpeg)
目前看起来,比刚开始舒服多了,但是没有标注,别人完全不知道你这是干嘛的图= =|||
自己作死没办法......脑子里一有这想法,又要继续优化
(1)基于《Python学堂-6》添加图名
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
接下来是整个图表的名称显示
fig.suptitle('温湿度随时间变化对比图', fontsize = 15)
suptitle()中参数fontsize的作用是控制标题字体大小
优化后的代码及可视化结果送上
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
df = pd.read_excel('D:PycharmProjectsData exercises数据可视化数据.xlsx')
x = df['时间']
y1 = df['温度']
y2 = df['湿度']
fig = plt.figure(figsize = (13,4))
ax1, ax2 = fig.subplots(2,1,sharex=True)
fig.suptitle('温湿度随时间变化对比图', fontsize = 15)
ax1.plot(x, y1)
ax2.plot(x, y2)
plt.xticks(rotation = -20)
plt.show()
![fed283ba0ff4584159cec7d043dbf24c.png](https://i-blog.csdnimg.cn/blog_migrate/6044a43ec09d633a168c447b0d371557.jpeg)
(2)添加图例---legend()
legend()中可传参数很多,这里先不一一列举了,够用就行,以后遇到了再深入学习。
默认参数会使用每个子图中的的纵坐标值的属性名称作为显示图例的名称
这句话好绕口,
ax1.plot(x, y1) 子图1中,传入的y1值即为“温度”属性名称下的值,因此:
ax1.legend()显示出来就是“温度”,同理ax2.legend()显示出来就是“湿度”
ax1.legend()
ax2.legend()
直接上图,上代码,自行体会(同时给与了线条不同的颜色)
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('D:PycharmProjectsData exercises数据可视化数据.xlsx')
x = df['时间']
y1 = df['温度']
y2 = df['湿度']
fig = plt.figure(figsize = (13,4))
ax1, ax2 = fig.subplots(2,1,sharex=True)
fig.suptitle('温湿度随时间变化对比图', fontsize = 15)
ax1.plot(x, y1, color = 'r')
ax2.plot(x, y2, color = 'g')
ax1.legend()
ax2.legend()
plt.xticks(rotation = -20)
plt.show()
![6fb6b446f65211f1429472b65cf1f8d9.png](https://i-blog.csdnimg.cn/blog_migrate/79091e3d3fc7e606a5933d28e3452031.jpeg)
今天的到此为止~喜欢的朋友们点点关注,想交流的随时留下问题共同探讨~