Matplotlib库的使用
一、用图表达数据
Matplotlib.pyplot绘制图形的命令子库,相当于快捷方式。
1、列表画图,并保存
import matplotlib.pyplot as plt
plt.plot([3, 1, 4, 2, 5])
plt.ylabel("grade")
plt.savefig('test', dpi=600) #默认为PNG文件,dpi:每英寸包含像素点数量
plt.show()
2、plot(x,y)
import matplotlib.pyplot as plt
plt.plot([0, 2, 4, 6, 8],[3, 2, 4, 5, 2])
plt.ylabel("Grade")
plt.axis([-1, 10, 0, 6]) #设定横纵坐标的范围
plt.show()
3、绘图区域设置:
plt.subplot(nrows, ncols, plot_number)
import matplotlib.pyplot as plt
import numpy as np
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
a = np.arange(0.0, 5.0, 0.02)
plt.subplot(211)
plt.plot(a, f(a))
plt.subplot(2,1,2)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.show()
二、plt.plot(x, y, format_string, **kwargs)
- x:X轴数据,列表或数组,可选(省略时,默认为索引)。
- y:Y轴数据,列表或数组。
- format_string:控制曲线的格式字符串,可选。
-
- 由颜色字符('b', 'g', 'r', 'c'(cyan:青绿色), '#008000'(RGB某颜色), 'm'(洋红色), 'y', 'k', 'w', '0.8'(灰度值字符串))、风格字符('-', '--', '-.', ':', ' ' ' ')、标记字符('.', ',', 'o', 'v', '^', '>', '<', '1', '2', '3', '4', 's', 'p', '*', '+', 'x', 'D', 'd', '|')组成。
- **kwargs:第二组或更多(x, y, format_string)
-
- 当绘制多条曲线时,各条曲线的x不能省略。
- color:控制颜色; linestyle:控制风格,linestyle='dashed'; marker:标记风格,marker='o'; markerfacecolor: 标记颜色; markersize=20;......
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a, a*1.5,':^', a, a*2.5, "--.", a, a*3.5,'-.o', a, a*4.5,'-v')
plt.show()
三、pyplot的中文显示
1、pyplot并不默认支持中文显示,需要rcParams修改字体实现。
会改变所有字体
.rcParams['font.family']; .rcParams['font.style']='normal'|'italic'; .rcParams['font.size']
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.family']='SimHei' #SimHei:黑体;'Kaiti':中文楷体;'LiSu':中文隶书;'FangSong':中文仿宋....
plt.plot([3, 1, 4, 5, 2])
plt.ylabel('纵轴(值)')
plt.savefig('test', dpi=600)
plt.show()
2、在有中文的地方增加一个属性:
fontproperties
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=20)
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=20)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.show()
四、pyplot 的文本显示方法
- plt.xlabel()
- plt.ylabel()
- plt.title()
- plt.text():任意位置增加文本
- plt.annotate()在图形中增加带箭头的注释
-
- plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)
专业画法:
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), 'r--')
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) #$$中间为LaTex语法,排版
plt.text(2, 1,
r'$\mu=100$', fontsize=15)
#plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5),arrowprops=dict(facecolor='black',
shrink=0.1, width=2))
#其中shrink表示收缩箭头,使两边留有空白。
plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.show()
五、复杂的子绘图区域
1、plt.subplot2grid()
plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)
理念:设定网格,选中网格,确定选中行列区域数量,编号从0开始。plt.subplot2grid((3,3), (1,0), colspan=2)
其中GridSpec:网格划分行列数,CurSpec:选择区域起始位置;colspan:延伸列,总格数;rowspan:延伸行,向下,总格数。
2、GridSpec类 + subplot
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
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])
ax4 = plt.subplot(gs[2, 1])
Matplotlib基础绘图函数示例
一、pyplot基础图表函数概述
- plt.plot(x, y, fmt,...) 绘制坐标图
- plt.boxplot(data, notch, position) 绘制一个 箱形图
- plt.bar(left, height, width, bottom) 绘制一个条形图
- plt.barh(width, bottom, left, height) 横向条形图
- plt.polar(thera, r) 极坐标图
- plt.pie(data, explode) 饼图
- plt.psd(x, NFFT=256, pad_to, Fs) 功率谱密度图
- plt.specgram(x, NFFT=256, pad_to, F) 谱图
- plt.cohere(x, y, NFFT=256, Fs) X-Y的相关性函数
- plt.scatter(x, y) 散点图,其中 x和 y长度相同
- plt.step(x, y, where) 步阶图
- plt.hist(x, bins, normed) 直方图
- plt.contour(X, Y, Z, N) 等值图
- plt.vlines() 垂直图
- plt.stem(x, y, linefmt, marketfmt) 柴火图
- plt.plot_date() 数据日期
1、pyplot饼图绘制 plt.pie()
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)#autopct中间显示百分数的方式
plt.axis('equal')#将椭圆饼图改为正圆
plt.show()
2、直方图 plt.hist()
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
mu, sigma = 100, 20#均值和标准差
a = np.random.normal(mu, sigma, size=100)
plt.hist(a, 20, normed=1, histtype='stepfilled', facecolor='b', alpha=0.75)
#其中20代表bins为直方图的个数
#normed=1,将出现个数归一化总为1;normal=0,高度表示出现的个数
plt.title('Histogram')
plt.show()
3、面向对象绘制极坐标
import numpy as np
import matplotlib.pyplot as plt
N =20
theta = np.linspace(0.0, 2*np.pi, N, endpoint=False)
radii = 10 * np.random.rand(N)
width = np.pi / 4 * np.random.rand(N)
ax = plt.subplot(111, projection='polar') #采用面向对象的方法来绘制极坐标图
bars = ax.bar(theta, radii, width=width, bottom=0.0)
for r, bar in zip(radii, bars):
bar.set_facecolor(plt.cm.viridis(r / 10.))
bar.set_alpha(0.5)
plt.show()
4、面向对象绘制散点图
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(10*np.random.randn(100), 10*np.random.randn(100), 'o')
ax.set_title('Simple Scatter')
plt.show()
小结:如何绘制是次要的,关键是,找到合适的表现数据的图形,参数设计......。
引力波的绘制
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
rate_h, hstrain= wavfile.read(r"H1_Strain.wav","rb")
rate_l, lstrain= wavfile.read(r"L1_Strain.wav","rb")
#reftime, ref_H1 = np.genfromtxt('GW150914_4_NR_waveform_template.txt').transpose()
reftime, ref_H1 = np.genfromtxt('wf_template.txt').transpose() #使用python123.io下载文件
#reftime:时间序列,ref_H1:引力数据;np.genfromtxt()读入为两行矩阵
htime_interval = 1/rate_h #得到波形的时间间隔
ltime_interval = 1/rate_l
fig = plt.figure(figsize=(12, 6)) #figure()创建绘图空间
# 信号起始点
htime_len = hstrain.shape[0]/rate_h #个数*时间间隔,得到总时间长度
htime = np.arange(-htime_len/2, htime_len/2 , htime_interval)#以原点中心对称
plth = fig.add_subplot(221)
plth.plot(htime, hstrain, 'y')
plth.set_xlabel('Time (seconds)')
plth.set_ylabel('H1 Strain')
plth.set_title('H1 Strain')
ltime_len = lstrain.shape[0]/rate_l
ltime = np.arange(-ltime_len/2, ltime_len/2 , ltime_interval)
pltl = fig.add_subplot(222)
pltl.plot(ltime, lstrain, 'g')
pltl.set_xlabel('Time (seconds)')
pltl.set_ylabel('L1 Strain')
pltl.set_title('L1 Strain')
pltref = fig.add_subplot(212)
pltref.plot(reftime, ref_H1)
pltref.set_xlabel('Time (seconds)')
pltref.set_ylabel('Template Strain')
pltref.set_title('Template')
fig.tight_layout() #自动调整图像边缘
plt.savefig("Gravitational_Waves_Original.png")
plt.show()
plt.close(fig)