爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
楼主: 15195775117

[参考资料] [已收纳]python可视化库matplotlib与IDL对比

[复制链接]
 楼主| 发表于 2020-6-20 14:59:13 | 显示全部楼层
逆序坐标轴


360截图20200620145556702.jpg

import matplotlib.pyplot as plt
import numpy as np
#制图用微软雅黑支持汉字,该代码可作为常备设置:
plt.rcParams['font.family'] = 'Microsoft YaHei'


ap=np.linspace(1000,1050,100)#linspace的优点是知道数量
list(ap).reverse()#不转为list就不能reverse
temp=np.linspace(-20,20,100)


plt.plot(temp,ap)
plt.ylim(1050,1000)#关键句,其实跟IDL原理一样


plt.xlabel('气温')
plt.ylabel('气压')


plt.show()

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-20 15:19:40 | 显示全部楼层
图中表格


360截图20200620151610819.jpg

import matplotlib.pyplot as plt
import numpy as np
#制图用微软雅黑支持汉字,该代码可作为常备设置:
plt.rcParams['font.family'] = 'Microsoft YaHei'


colLabels=['鸡','鱼','肉','蛋']
rowLabels=['周一','周三','周五']
prices=np.arange(1,13)#索引序列
prices=prices.reshape((3,4))#变形


plt.table(cellText=prices,#单元格值
          colLabels=colLabels,#列标题
          rowLabels=rowLabels,#行标题
          colWidths=[0.2]*4,#单元格宽度
          colColours=['r','g','b','m'],#列标题填充色
          cellLoc='center',#单元格对齐样式
          rowLoc='center',
          loc='center')#表格在画布中的位置
plt.show()

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-20 16:08:21 | 显示全部楼层
箭头
360截图20200620160600391.jpg

import matplotlib.pyplot as plt
import numpy as np
#制图用微软雅黑支持汉字,该代码可作为常备设置:
plt.rcParams['font.family'] = 'Microsoft YaHei'

x=np.arange(0,np.pi*2,0.1)
y=np.sin(x)
plt.plot(x,y)

#arrow的效果真是丑,难以使用,且末端定位是箭头根部,不合理
#还不如使用annotate
plt.arrow(0,0,np.pi*0.5,1,
          head_width=0.1,head_length=0.1,
          fc='r',ec='r')
#这个效果就好多了:
plt.annotate('',
             (np.pi,0),#末端
             xytext=(np.pi*0.5,1),#起始点
             arrowprops=dict(arrowstyle='->',color='b'),
             color='g',size=20)

plt.show()

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-20 16:46:27 | 显示全部楼层
桑基图
1.jpg

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.sankey import Sankey
#制图用微软雅黑支持汉字,该代码可作为常备设置:
plt.rcParams['font.family'] = 'Microsoft YaHei'

#flows的正值之和为1,负值之和为-1:
flows=[0.3,0.2,0.4,0.1,-0.6,-0.05,-0.15,-0.2]
labels=['网店','直播','工资','私活','家庭','旅游','教育','运动']
orientations=flows/np.abs(flows)#该关键字表示流量水管的上下
sankey=Sankey()
sankey.add(flows=flows,
           labels=labels,
           orientations=orientations,
           color='k',
           fc='r',
           patchlabel='收支',
           alpha=0.7)
diagrams=sankey.finish()
diagrams[0].texts[4].set_color('b')#文字颜色
diagrams[0].texts[4].set_weight('bold')#粗体
diagrams[0].text.set_fontsize(20)#字体大小
diagrams[0].text.set_fontweight('bold')#粗体
plt.show()

#如果orientations=[1,1,0,-1,1,-1,1,0],则:
2.jpg

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-21 14:56:22 | 显示全部楼层
双Y轴
Figure_1.png

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
#字体设置:
plt.rcParams['font.family'] = 'KaiTi'
mpl.rcParams['axes.unicode_minus']=False#保证负号正常显示

#绘图数据:
fig,ax1=plt.subplots()
t=np.arange(0,np.pi*4,0.1)
s1=np.sin(t)
s2=np.cos(t)

ax1.plot(t,s1,c='r',ls='-',lw=3)
ax2=ax1.twinx()#ax2与ax1共享x轴,twiny是共享y轴
ax2.plot(t,s2,c='b',ls=':',lw=3)#叠加图

ax1.set_xlabel('弧度角',color='g',size=15)#x轴标题绿色
ax1.set_ylabel('正弦',color='r',size=15)#第一y轴标题红色
ax2.set_ylabel('余弦',color='b',size=15)#第二y轴标题蓝色

ax1.tick_params('x',colors='g')#横轴绿色
ax1.tick_params('y',colors='r')#第一y轴红色
ax2.tick_params('y',colors='b')#第二y轴蓝色
plt.title('双Y轴',size=18)
plt.show()

#注意:曲线颜色要与坐标轴颜色一致!该例中一个红色,一个蓝色
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-21 16:58:29 | 显示全部楼层
撑满画布


Figure_1.png

#撑满画布的图是很实用的,其中之一就是等值线图或扇形图贴进地图
import matplotlib.pyplot as plt
import numpy as np
#制图用微软雅黑支持汉字,该代码可作为常备设置:
plt.rcParams['font.family'] = 'Simhei'


x=np.arange(0,np.pi*2+0.1,np.pi/8)
y=np.sin(x)


plt.axes([0,0,1,1])#撑满画布,相当于IDL的position=[0,0,1,1]
plt.axis('off')#隐藏坐标轴
plt.plot(x,y,marker='o')
plt.xlim(0,np.pi*2)#纵横轴范围也要撑满
plt.ylim(-1,1)
plt.axhline(y=0,c='r',lw=2)#水平参考线
plt.show()

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-21 18:03:36 | 显示全部楼层
刻度的有无
Figure_1.png

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] = 'KaiTi'#楷体

x=np.arange(0,np.pi*2,0.1)
y=np.sin(x)
plt.subplot(1,2,1)
plt.plot(x,y)
plt.xticks([np.pi,np.pi*2],['π','2π'])#有刻度和标记的
plt.subplot(1,2,2)
plt.plot(x,y)
plt.xticks([])#无刻度和标记

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-21 21:50:45 | 显示全部楼层
移动XY轴
Figure_1.png
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.family'] = 'KaiTi'

x=np.arange(0,np.pi*2,0.1)
y=np.sin(x)
ax=plt.subplot()#直接用plt不行
ax.plot(x,y)
ax.spines['top'].set_color('none')#去除上测轴脊
ax.spines['right'].set_color('none')#去除右测轴脊
ax.spines['bottom'].set_color('r')#x轴红色
ax.spines['bottom'].set_position(('data',0))#把x轴移到y=0的地方
ax.spines['left'].set_position(('data',0))#把y轴移到y=0的地方

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-22 11:14:06 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-22 11:16 编辑

极区图


Figure_1.png

#极区图就是极坐标下的柱状图
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
from matplotlib.sankey import Sankey
#字体设置:
plt.rcParams['font.family'] = 'Microsoft YaHei'
plt.rcParams['font.size'] = 12


n=8#极区图分8块
theta=np.arange(0,np.pi*2,np.pi*2/8)#每块对应的角度
r1=np.arange(10,18,1)
r2=np.arange(1,9,1)


width=2*np.pi/n*0.8#宽度*0.8是为了不太挤
#颜色表说明:#RRGGBBskyblue天蓝色挺好看,burlywood木色有特点
colors=['r','g','b',
        '#FF0000','#00FF00','#0000FF',
        'skyblue','burlywood']
#各块对应的名称:
labels=['东','东北','北','西北','西','西南','南','东南']


#左侧图画普通柱状图:
plt.subplot(121)
plt.bar(theta,r2,
            width=width,
            color=colors,
            tick_label=labels,
            bottom=r1)#r2以r1为底加高
plt.title('柱状图')


#极区图,极坐标下的柱状图
plt.subplot(122,polar=True)
plt.bar(theta,r2,width=width,color=colors,
            bottom=r1,#r2以r1为底加高
            tick_label=labels)


plt.title('极区图')
plt.show()

#如果设置bottom=0,则:
Figure_2.png

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-22 14:11:28 | 显示全部楼层
色条
Figure_1.png
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
plt.rcParams['font.family'] = 'Microsoft YaHei'
plt.rcParams['font.size'] = 12

x=np.arange(0,np.pi*2,0.01)
y=np.sin(x)

#最佳红蓝色条:rainbow
#最佳垂直风色条:bwr
#色条反向加个_r:rainbow_r,jet_r,...
plt.subplot(231)
plt.scatter(x,y,c=y,cmap='jet')
plt.title("cmap='jet'",color='r')

plt.subplot(232)
plt.scatter(x,y,c=y,cmap='rainbow')
plt.title("cmap='rainbow'",color='r')

plt.subplot(233)
plt.scatter(x,y,c=y,cmap='RdYlBu_r')
plt.title("cmap='RdYlBu_r'",color='r')

plt.subplot(234)
plt.scatter(x,y,c=y,cmap='coolwarm')
plt.axhline(y=0,c='r',lw=2)
plt.title("cmap='coolwarm',适合描述垂直风",color='r')

plt.subplot(235)
plt.scatter(x,y,c=y,cmap='bwr')
plt.axhline(y=0,c='r',lw=2)
plt.title("cmap='bwr',适合描述垂直风",color='r')

plt.show()
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表