爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
楼主: 15195775117

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

[复制链接]

新浪微博达人勋

 楼主| 发表于 2019-8-11 00:46:21 | 显示全部楼层

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

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-17 15:49:25 | 显示全部楼层
------本帖继续更新------




本帖从去年6月底发布,现在又是6月,这都快一年了,我都忘了自己学过matplotlib了。
以前的制图方法从哪看的我都忘了,从现在起我开始“撕读”这本《Python数据可视化之matplotlib实践》。


matplotlib制图,底层叫【画布】(与PS一样),是一个Figure实例,画布之上是【图形】,是Axes实例。
虽然Axes是轴的意思,但它表示图形。
Axes有x轴和y轴的属性,可以通过Axes.xaxis和Axes.axis来设置轴的属性。

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

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-17 17:21:46 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-21 17:11 编辑

曲线、散点、参考线(区)
360截图20200618094856433.jpg
import matplotlib.pyplot as plt
import numpy as np

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

x=np.arange(0,10,0.5)#0,0.1,0.2,...,9.8,9.9
y=np.random.randn(20)#标准正态分布中随即选100个数
y.sort()#排序
#ls=linestyle,lw=linewidth,label=图例=IDL的legend名
plt.scatter(x,y,ls='-',c='red',lw=2,marker='d',label='正态分布')#散点
plt.plot(x,np.sin(x),c='g',ls='dashed',lw=4,label='正弦曲线')
plt.xlim(0,10)#轴范围
plt.ylim(-3,3)
plt.xlabel('横轴名')

plt.grid(ls=':',c='g')#网格线

#只要竖线:plt.grid(axis='x')
#只要横线:plt.grid(axis='y')
plt.axhline(y=0,c='r',lw=2)#水平参考线
plt.axvline(x=5,c='b',ls='-')#垂直参考线
#facecolor是填充色
plt.axhspan(ymin=-1,ymax=1,alpha=0.5,facecolor='r')#水平参考区
plt.axvspan(xmin=4,xmax=6,alpha=0.5,facecolor='b')#垂直参考区

plt.legend()#显示图例,图例位置是自适应的,比IDL便捷多了
#也可以设置位置:
# plt.legend(loc='lower left')

plt.title('标题在此')#标题

plt.show()#显示画布
#plt.scatter中marker=IDL的sym:
#'o'表示实心圆,'s'实心正方形,'*'五角星,'D'胖菱形

#简写法:
#color等同于c;ls等同于linestyle;lw等同于linewidth
#green等同于g,red=r,blue=b



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

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-18 09:19:53 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-18 09:52 编辑

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

#曲线:
pi=np.pi
x=np.arange(0,pi*2,0.01)
y=np.sin(x)
plt.plot(x,y,c='c',label='曲线')

#无指向注释
plt.text(pi*1.5,-1+0.1,'谷',color='b')

#箭头风格:
arrow_dict=dict(arrowstyle='->',connectionstyle='arc3',color='r')

#矢量性注释
plt.annotate('峰',#注释文本
             xy=(pi/2,1.0),#箭头指向的位置
             xytext=((pi/2)+1.0,1.0),#注释文本的位置
             weight='bold',color='r',#文本粗细和颜色
             arrowprops=arrow_dict
             )
plt.legend()
plt.show()

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

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-18 10:21:33 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-18 22:44 编辑

柱状图

360截图20200618101844277.jpg


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

x=np.arange(1,9,1)
y=np.random.randn(8)

plt.bar(x,y,
        align='center',
        color='c',#填色
        hatch='/',#填充斜杠
        tick_label=['鼠','牛','虎','兔','龙','蛇','马','羊'])
#wonderf!横轴可以标记文字,星期序列、污染物种都可以了,这是IDL很难做的

plt.xlabel('生肖')
plt.show()

x可以离散不均匀,如果x=[1,2,4,5,6,7,8,9],那么:
360截图20200618143852753.jpg


横向柱状图

360截图20200618102333290.jpg

只需要把bar改为barh即可,其他不变

斜杠可以加密,如果hatch='////',则:

360截图20200618224237032.jpg

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

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-18 10:44:36 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-19 15:55 编辑

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


x=np.random.randn(100000)
bins=np.arange(-4,4,0.05)#柱体的划分
plt.hist(x,bins=bins,color='r',histtype='bar',rwidth=1)
plt.show()
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-18 11:00:51 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-19 16:15 编辑

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


x=[1,2,3,4]
labels=['鸡','鸭','鱼','肉']
colors=['r','g','b','c']
explode=[0.1,0.1,0.1,0.1]#分离距离


plt.pie(x,labels=labels,colors=colors,#数量、名称、颜色匹配
        explode=explode,#分离
        shadow=True,#阴影
        radius=1.2,#半径
        autopct='%3.1f%%',#标记百分比
        startangle=0)#起始角度


plt.pie(x,labels=labels,colors=colors,#数量、名称、颜色匹配
        radius=0.5,
        autopct='%3.1f%%',#标记百分比
        startangle=180)#起始角度


#pie制图用笛卡尔坐标,第一个扇形从正东逆时针
#startangle=90,第一个扇形从正北逆时针转
plt.show()
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-18 11:26:33 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-21 13:50 编辑

极坐标

360截图20200618111928472.jpg

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

theta=np.arange(0,np.pi*2,0.1)
r=np.sin(t)
plt.polar(theta,r,#角度和值的顺序与IDL相反
          c='g',lw=2,marker='*',
          mfc='r',#应该是marker_fill_color
          ms=20)#可能是marker_scale
plt.show()

思考:
该polar函数定死了是笛卡尔坐标系,对于从正北顺时针的方位角不适用

极坐标散点

Figure_1.png

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

theta=np.arange(0,360,22.5)/180*np.pi#16等分圆
r=np.arange(1,11,1)*7.5#距离序列
plt.subplot(polar=True)#设置为极坐标
theta2,r2 = np.meshgrid(theta,r)#网格化,从2个序列到二维规则网格
plt.scatter(theta2,r2,#角度和值的顺序与IDL相反
          c='r',marker='*')
plt.show()

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

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-18 13:49:47 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-22 14:48 编辑

散点的配色、形状、大小

360截图20200618134205172.jpg
#该散点图十分有用,还能匹配大小
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
#制图用微软雅黑支持汉字,该代码可作为常备设置:
plt.rcParams['font.family'] = 'Microsoft YaHei'

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

plt.scatter(x,y,
            s=x*16,#标记的大小,随x
            c=y,#标记的颜色,随y
            cmap='rainbow',#色条
            marker='*')

plt.show()

其实,散点的配色序列是自定义的
c=x,则颜色随x轴走;c=y,则颜色随y轴走;c还可以是其他的,例如定义一个z:


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.1)
y=np.sin(x)
z=np.cos(x)


plt.scatter(x,y,c=z,cmap='rainbow')
plt.scatter(x,z,c=z,cmap='rainbow')
plt.show()

效果:
Figure_1.png

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

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2020-6-18 14:01:48 | 显示全部楼层
本帖最后由 15195775117 于 2020-6-23 10:17 编辑

棉棒图
360截图20200618135929726.jpg

#棉棒图以前没画过,可理解为变形的柱状图
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
#制图用微软雅黑支持汉字,该代码可作为常备设置:
plt.rcParams['font.family'] = 'Microsoft YaHei'
x=np.arange(0,np.pi*2,0.2)
y=np.sin(x)
plt.stem(x,y,
          linefmt='-.',#棉棒样式
          markerfmt='o',#棉棒末端样式
          basefmt='-'#基线样式
         )
plt.show()

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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