学完Numpy该学matplotlib了,看了看MATLAB入门课,现在看应该非常简单了。
学习资料来自MOOC北理工嵩天老师的Python数据分析与展示,链接放在下面。
在Ubuntu20.04中使用spyder进行学习。
Have fun!
引入matplotlib的默认方法:一般来说我们用的最多的是子库pyplot
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
plt.plot([3, 1, 4, 5, 2])
plt.ylabel("grade")
plt.show()
跟matlab比较像,就是调用的函数都是在plt包下的。
ylabel
指定y轴名称,show
在右侧控制台中显示图像。
保存图像:
savefig(imageName,dpi)
:第一个参数指定图像名称,第二个指定dpi(dot per inch)图像质量。
指定横纵坐标的区间:
axis
:
plt.axis([-1, 10, 0, 6])
x轴-1~10,y轴0~6。
演示:
import matplotlib.pyplot as plt
plt.plot([0, 2, 4, 6, 8], [3, 1, 4, 5, 2])
plt.ylabel("grade")
plt.axis([-1, 10, 0, 6])
plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UZdTEuer-1654179393989)(src/images/test.png)]
plot相关见北邮电子院MATLAB入门
对曲线特征描述也可以使用参数color
,marker
,linestyle
,markerfacecolor
,markersize
。字符表示时顺序最好是color,marker,linestyle.
对于研究生或者以后要写英文论文而言,基本上没有这方面的困惑,但是平时组会还有工作中这方面存在这方面的需求,了解一下最好。
pyplot默认不支持中文的显示,需要设置rcParams参数:
import matplotlib
import matpotlib.pyplot as plt
matplotlib.rcParams['font.family'] = 'SimHei'
plt.plot([3, 1, 4, 5, 2])
plt.ylabel("纵轴")
pt.show()
rcParams
属性:
attributes | comment |
---|---|
‘font.family’ | 字体名字 |
‘font.style’ | 字体风格正常’normal’,斜体’italic’ |
‘font.size’ | 字体大小,整数字号或者’large’,‘x-small’ |
family的几个例子,这些中文字体一般需要下载到固定位置:
比如我目前用的是anaconda3的python3.9:
/home/leiyunfei/anaconda3/lib/python3.9/site-packages/matplotlib/mpl-data/fonts/ttf
下载ttf文件后将文件放在这个文件夹下并且删除:
~/.cache/matplotlib
文件夹下的matplotlib缓存。重启spyder就好了。
示例:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 20
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间')
plt.ylabel('纵轴:振幅')
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.savefig('redWave')
plt.show()
在这里遇到一个坑,使用savefig时保存的图片不完整,这是因为savefig有一个参数bbox_inches,默认情况只保存给定区域内的图像,设定bbox_inches则会保存全部图像。
之后这里又遇到一个坑:savefig
函数要在show
函数之前使用,否则保存的是空白。
**虽然这里设定rcParams可以解决中文的问题,**但是这样会更改全局的属性,这显然不太好,那么还有一种方法,只在需要中文显示的时候使用,更改本次的属性:
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.2)
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=20)
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=20)
plt.plot(a, np.cos(2*np.pi*a), 'y-.')
plt.show()
在xlabel,ylabel
中修改fontproperties
和fontsize
来修改本次的中文显示参数。
function | comment |
---|---|
plt.xlabel() | 对x轴增加文本 |
plt.ylabel() | 对y轴增加文本 |
plt.title() | 图像上方增加文本 |
plt.text() | 在任意位置增加文本 |
plt.annotate() | 在图形中增加带箭头的注释 |
实例:
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'k--')
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15, color='green')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
plt.title(r'正弦波实例 $y=cos(2\pi x)$', fontproperties='SimHei', fontsize=25)
plt.text(2, 1, r'$\mu=100$', fontsize=15)
plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.savefig('textExample', bbox_inches='tight')
plt.show()
注意:这里的$$
中的是Latex风格的行内公式,字符串前面有r代表raw string,屏蔽转义字符。
plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)
参数如下:
attributes | comment |
---|---|
text | 注释的文本 |
xy | 箭头位置 |
xytext | 文本位置 |
xycoords | 箭头坐标系统 |
textcoords | 文本坐标系统,默认与xycoords相同 |
arrowprops | 箭头属性 |
其中arrowprops中包含属性:
attributes | comment |
---|---|
width | 箭头宽度,单位是点 |
facecolor | 箭头颜色 |
shrink | 箭头收缩,单位百分比 |
headwidth | 箭头头部的宽度 |
headlength | 箭头头部的长度 |
其他很多 |
实例:
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'c-.')
plt.xlabel("time", fontsize=15, color='blue')
plt.ylabel("amplitude")
plt.title(r'sin wave $y=cos(2\pi x)$', fontsize=15)
plt.annotate(r'$\mu=100$', xy=(2,1), xytext=(3,1.5),
arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.savefig('annotateExample', bbox_inches='tight')
plt.show()
老师说,掌握到这样就差不多了,有必要再去深挖。
suplot2grid
subplot2grid(shape, loc, rowspan=1, colspan=1, fig=None, **kwargs)
参数解释:
args | comments |
---|---|
shape | 元组,表示想将图分割成什么样的比如(3, 3),将总图化成3*3的 |
loc | 元组,绘制起始位置,比如(1, 0),从第1行第0列起始 |
rowspan | 行扩展,占几行,默认1 |
colspan | 列扩展,占几列,默认1 |
实例:
import matplotlib.pyplot as plt
plt.subplot2grid((3, 3), (0, 0), colspan=3)
plt.subplot2grid((3, 3), (1, 0), colspan=2)
plt.subplot2grid((3, 3), (1, 2), rowspan=2)
plt.subplot2grid((3, 3), (2, 0))
plt.subplot2grid((3, 3), (2, 1))
plt.savefig('subplot2gridEx', bbox_inches='tight')
plt.show()
matplotlib.gridspec
matplotlib下的一个类,用于指明绘制子区域的设计,与subplot结合使用,用gridspec.GridSpec对象代替比如subplot(222)中的222。
实例:
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
gs = gridspec.GridSpec(3, 3)
ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, :-1])
ax3 = plt.subplot(gs[1:, -1])
ax4 = plt.subplot(gs[2, 0])
ax5 = plt.subplot(gs[2, 1])
plt.show()
可以达到相同的效果
funcs | image | funcs | image |
---|---|---|---|
boxplot | 箱形图 | contour | 等值图 |
bar | 条形图 | lines | 垂直图 |
barh | 横向条形图 | stem | 柴火图 |
polar | 极坐标图 | scatter | 散点图 |
pie | 饼状图 | cohere | X-Y相关性函数图 |
psd | 功率谱密度图 | plot_date | 数据日期图 |
specgram | 谱图 |
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=False, startangle=90)
plt.axis('equal')
plt.show()
一些参数解释:
args | comment |
---|---|
explode | 突出的比例 |
autopct | 饼中串的字符 |
startangle | 起始角度,笛卡尔坐标系 |
shadow | 是否有阴影 |
还有直方图,极坐标图等,就像matlab中的stem,stairs等图,等到用的时候再查资料就好了,没必要细看,反正也记不住。学习嘛,功利一些。