前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python气象绘图教程(三)

Python气象绘图教程(三)

作者头像
气象学家
发布2020-06-09 15:29:27
2.9K0
发布2020-06-09 15:29:27
举报
文章被收录于专栏:气象学家气象学家

更多的关于基础折线图技巧

前面已经讲了很多关于折线图的常用参数,但是像颜色关键词在黑白文献中应该如何修改呢?plot()提供了一个marker=' '参数,其具体变化如下:

代码语言:javascript
复制
plt.plot(x,tem,c='k',lw=1,ls='-',marker='*')
plt.plot(x,tem,c='k',lw=1,ls='-',marker='d')

这样就能在黑白情况下区分不同的线条了。官网给出了很多符号样式,可挑选你觉得好看的符号样式即可(虽然我觉得没几个好看的):

气象上常用的有三线图、五线图。三线图主要是日常气象分析的气压、气温、湿度(或其他绘图量)有时还会绘制降水柱状图。五线图主要是展示春夏秋冬和年平均的变化关系。一张图如果有更多的线条会使得界面凌乱不堪,不能用于科学分析。

这两张图就是典型的折线图,折线图在表示某个气象数据随时间变化特点时相对视觉观感更好。

下面讲讲第一张图的绘制(第二张难度主要是反映在数据处理上),在前面初步接触折线图绘制时,在引入库包后有一个步骤叫做虚拟数据,这是因为还没有学习读取数据。在python入门教程中会介绍open命令,和其他语言一样,是作为读取文件的命令。但是在py中,有一个专门进行数据处理的库包叫做pandas(为什么称为胶水语言,就是因为随时调取需要的库包),引入库包命令为:

代码语言:javascript
复制
import pandas as pd

我实验时的数据存储在excel文件中,pandas提供了一个专门的读取命令

代码语言:javascript
复制
pd.read_excel(  )

按照字面意思,read_excel即读取excel文件:

代码语言:javascript
复制
filename=r'C:\Users\lenovo\Desktop\绵竹.xlsx'
df=pd.read_excel(filename)
print ( df )

上述步骤即将excel文件读取到df变量中存储起来,然后打印出df。第一句是我给出了文件的绝对引用地址,这样py就会去读取这个指定文件。

第一列叫做索引,是用来区别每一行的。英文这一行叫做表头,用于区分每一列。显然,此时还不能绘图,因为没有提取出每一列的数值。这是可以使用表头进行提取,比如提取 'TEM'(温度)这一列:

代码语言:javascript
复制
temps=df['TEM']
print  (temps)

这样,一列数据就被提取出来了。还可以对这列数据进行切片:

代码语言:javascript
复制
temps=df['TEM'][0:9]
print  (temps)

至于为什么只能到索引为8而不是9,请查阅列表的切片原则(我懒,理不直气也壮.jpg)。还可以跳跃读取:

代码语言:javascript
复制
temps=df['TEM'][0:9:4]
print  (temps)

这是每间隔四个数值取一个。

现在大概弄清楚了数据的读取,可以展示全部的过程了:

代码语言:javascript
复制
filename=r'C:\Users\lenovo\Desktop\绵竹.xlsx'
df=pd.read_excel(filename)#####读取文件###########
pressures=df['PRS_Sea']#####给每种气象特征量一个列表用以储存数据####
temps=df['TEM']#####给每种气象特征量一个列表用以储存数据####
rhu=df['RHU']#####给每种气象特征量一个列表用以储存数据####
rains=df['PRE_1h']#####给每种气象特征量一个列表用以储存数据####

按照我们之前介绍的绘图步骤,接下来应该作甚呢

代码语言:javascript
复制
fig=plt.figure(figsize=(7,4),dpi=200)

没错,引入画布,没有纸怎么画呢?第二步添加绘图区:

代码语言:javascript
复制
ax1=fig.add_subplot(111)

subplot命令是在画布上添加一个绘图区,括号里的内容转述为汉字为:“创建一个一行一列的绘图区(一行一列就只有一个绘图区),ax1是第一个绘图区(本来就只有一个*囧*)”不懂的话可以做一个小测试:

代码语言:javascript
复制
ax1=fig.add_subplot(221)
ax2=fig.add_subplot(222)
ax3=fig.add_subplot(223)
ax4=fig.add_subplot(224)

上述命令就是创建一个两行两列的子图区,分别为ax1,ax2,ax3,ax4。

理解了这个就可以引入数据画图了:

代码语言:javascript
复制
fig=plt.figure(figsize=(7,4),dpi=200)
ax1=fig.add_subplot(111)
line1,=ax1.plot(times,temps,'r:',linewidth=1,label='气温')
bar1 =ax1.bar(times,rains,color='b',label='降水量')
line2,=ax1.plot(times,pressures,'k-',linewidth=1.2,label='气压')
plt.legend((line1,bar1,line2),('气温','降水量','气压'),loc='center left',frameon=False,framealpha=0.5)
ax1.set_xlabel('时间 \ h')
ax1.set_ylabel('气温(℃)\降水量(mm)')
plt.title("绵竹市某日常规观测")

出图:

wtf?????(??小问号你是否有很多小朋友??),没有报错,并且绘制出图形了,那么问题出在哪里?——出在量级单位不一致。

南信的天气图分析课经常手绘天气图,500的图一般从1000百帕开始绘制,每隔2.5一根线,气温每4℃一根~~~~~~~~~魔音贯脑~~~~~~~~~~~~。可是气温大概在多少呢,气温肯定不会超出100℃(那样我就成刚出笼的小笼包——浑身冒气了),降水的常见额度又是多少呢?不到500mm吧。即使从降水量来说,和气压动不动上千相比,他们就被压制在地平线了。怎么解决这个问题?

有一个命令叫做twin(双胞胎),显然,气压和气温降水的x轴都是时间,所以我们来让x轴被合并使用,修改后程序为:

代码语言:javascript
复制
fig=plt.figure(figsize=(7,4),dpi=200)
ax1=fig.add_subplot(111)
line1,=ax1.plot(times,temps,'r:',lw=1,label='气温')
bar1 =ax1.bar(times,rains,color='b',label='降水量')
ax2=ax1.twinx()
line2,=ax2.plot(times,pressures,'k-',lw=1.2,label='气压')
plt.legend((line1,bar1,line2),('气温','降水量','气压'),loc='center left',frameon=False,framealpha=0.5)
ax1.set_xlabel('时间 \ h')
ax1.set_ylabel('气温(℃)\降水量(mm)')
ax2.set_ylabel('气压(hPa)')
plt.title("绵竹市某日常规观测")
plt.show()

问题解决了。原理是什么——刚才已经讲过了twin,在上面程序的第5行有ax2=ax1.twinx(),这代表新建了一个绘图区,但是两个绘图区共用x轴,按照官网手册介绍,ax2和ax1共用x轴,但是ax1使用左侧y轴,ax2使用右侧y轴。这样,量级不同导致线条起伏程度不够就迎刃而解。

另外还有些装饰性的命令,比如title,label等,按照其单词意思猜测即可,具体参考基础的教程,比如我推荐的莫烦大神的教材。主要是想分享共用坐标轴这一个解决方案,因为我之前犯过这个错误。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象学家 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档