Matplotlib 详细绘图

pyplot

Matplotlib 库由各种可视化类构成,内部结构复杂,受 Matlab 启发,matplotlib.pyplot 是绘制各类可视化图形的命令子库,相当于快捷方式。

实例

plt.plot() 只有一个输入列表或数组时,参数被当作Y轴,X轴以索引自动生成。

当有两个以上参数时,按照 X 轴和 Y 轴顺序绘制数据点。

plt.figure() 设置图片大小。

plt.savefig() 将输出图形存储为文件,默认 PNG 格式,可以通过 dpi 修改输出质量。

import matplotlib.pyplot as plt
plt.figure(figsize=(8,4),dpi=80)
plt.plot([0,2,4,6,8],[3,1,4,5,2])
plt.ylabel('Grade')
plt.axis([-1,10,0,6]) #确定x,y轴的范围
plt.savefig('test',dpi=600)
plt.show()

pFiCyoWkRa.png!large

pyplot的绘图区域

plt.subplot(nrows, ncols, plot_number)

在全局绘图区域中创建一个分区体系,并定位到一个子绘图区域
plt.subplot(3,2,4) 简写形式:plt.subplot(324) 划分3\times2个区,位于第4个绘图区。

b1yRO4OqKR.png!large

例:

f(t_1)=e^{t_1}\cos(2\pi t_1)\\{}\\ f(t_2)=\cos(2\pi t_2)

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,5,0.02)
plt.subplot(211)
plt.plot(a,f(a))
plt.subplot(212)
plt.plot(a,np.cos(2*np.pi*a),color='r', linestyle='--', marker='.') #等价于plt.plot(a,np.cos(2*np.pi*a),'r--.') 
plt.savefig('例1')
plt.show()

BoJBXi46Ev.png!large

pyplot 中的 plt.plot() 函数

plt.plot(x, y, format_string, **kwargs)
x: X轴数据,列表或数组,可选。
y: Y轴数据,列表或数组。
format_string: 控制曲线的格式字符串,可选。
**kwargs: 第二组或更多(x, y, format_string)。

注意:当绘制多条曲线时,各条曲线的x不能省略。

a = np.arange(10)
plt.plot(a,a*1.5,a,a*2.5,a,a*3.5,a,a*4.5)
plt.show()

gEIqeWTaux.png!large

format_string: 控制曲线的格式字符串,由颜色字符、风格字符和标记字符组成,可选。

颜色字符 说明
‘b’ 蓝色
‘g’ 绿色
‘r’ 红色
‘c’ 青绿色 cyan
‘m’ 洋红色 magenta
‘y’ 黄色
‘k’ 黑色
‘w’ 白色
‘#008000’ RGB 颜色的 16 进制码
‘0.8’ 灰度值字符串
线风格字符 说明
‘-‘ 实线
‘–’ 破折线
‘-.’ 点划线
‘:’ 虚线
‘ ‘ 无线
标记字符 说明
‘.’ 点标记
‘,’ 像素标记(极小点)
‘o’ 实心圈标记
‘v’ 倒三角标记
‘^’ 上三角标记
‘>’ 右三角标记
‘<’ 左三角标记
‘1’ 下花三角标记
‘2’ 上花三角标记
‘3’ 左花三角标记
‘4’ 右花三角标记
‘s’ 实心方形标记
‘p’ 实心五角标记
‘*‘ 星形标记
‘h’ 竖六边形标记
‘H’ 横六边形标记
‘+’ 十字标记
‘x’ 叉标记
‘D’ 菱形标记
‘d’ 瘦菱形标记
‘|’ 垂直线标记
a = np.arange(10)
plt.plot(a,a*1.5,'go:',a,a*2.5,'rx',a,a*3.5,'^',a,a*4.5,'bd-.')
plt.show()

YtopVbZFK8.png!large

空心圆标记 color 设置为’’

pyplot的中文显示

pyplot 默认不支持中文显示,需要 rcParams 修改字体实现

import matplotlib
matplotlib.rcParams['font.family']='SimHei'
plt.plot([3,1,4,5,2])
plt.ylabel('纵轴(值)')
plt.savefig('test',dpi=600)
plt.show()

rcParams 的属性

属性 说明
‘font.family’ 用于显示字体的名字
‘font.style’ 字体风格,正常’normal’或斜体’italic’
‘font.size’ 字体大小,整数字号或者’large’、’x‐small’

rcParams[‘font.family’]

中文字体 说明
‘SimHei’ 中文黑体
‘Kaiti’ 中文楷体
‘LiSu’ 中文隶书
‘FangSong’ 中文仿宋
‘YouYuan’ 中文幼圆
‘STSong’ 华文宋体
matplotlib.rcParams['font.family']='FangSong'
matplotlib.rcParams['font.size']=20
plt.rcParams['axes.unicode_minus']=False # 解决负号不显示乱码问题
a = np.arange(-2*np.pi,2*np.pi,0.02)
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.subplot(111)
plt.plot(a,np.sin(4*a),'--',a,2*np.cos(4*a),'-.',a,3*np.sin(4*a),':',a,4*np.cos(4*a),'-')
plt.show()

1ijVZDmdmn.png!large

方法二:
在有中文输出的地方,增加一个属性:fontproperties。

a = np.arange(0,5,0.02)
plt.figure(figsize=(20,8),dpi=80) # 设置图形大小
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=20)
plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=20)
plt.title('$f(a)=cos(2\pi a)$')
plt.plot(a,np.cos(2*np.pi*a))
plt.savefig('例5',dpi=600)
plt.show()

V4RCyei2Pe.png!large

刻度,标签,图例

  • 设置刻度范围
plt.axis()
plt.xlim(), plt.ylim()
ax.set_xlim(), ax.set_ylim()
  • 设置显示的刻度
plt.xticks(), plt.yticks()
ax.set_xticks(), ax.set_yticks()
  • 设置刻度标签
plt.xticklabels(), plt.yticklabels()
ax.set_xticklabels(), ax.set_yticklabels()
  • 设置坐标轴标签
plt.xlabel(), plt.ylabel()
ax.set_xlabel(), ax.set_ylabel()
  • 设置标题
plt.title()
ax.set_title()
  • 图例
ax.plot(label= '图例')
ax.legend(), plt.legend()
LOC = 'best' # 自动选择放置图例最佳位置
# 'upper right': 1, 'upper left': 2, 'lower left': 3, 'lower right': 4
#划分子区域并实例化
fig, ax = plt.subplots(1)
#绘图
ax.plot(np.random.randn(1000).cumsum(), label='line0')
ax.plot(np.random.randn(1000).cumsum(), label='line1')
ax.plot(np.random.randn(1000).cumsum(), label='line2')
# 设置刻度
#plt.xlim([0,500])
ax.set_xlim([0, 600])

# 设置显示的刻度
#plt.xticks([0,500])
ax.set_xticks(range(0,500,100))

# 设置刻度标签
ax.set_yticklabels(['Jan', 'Feb', 'Mar'])

# 设置坐标轴标签
ax.set_xlabel('Number')
ax.set_ylabel('Month')

# 设置标题
ax.set_title('Example')

# 图例

ax.legend()
ax.legend(loc='best')
#plt.legend()

YtrwQiQEHB.png!large

pyplot的文本显示

函数 说明
plt.xlabel() 对X轴增加文本标签
plt.ylabel() 对Y轴增加文本标签
plt.title() 对图形整体增加文本标签
plt.text() 在任意位置增加文本
plt.annotate() 在图形中增加带箭头的注解
a = np.arange(0,5,0.02)
plt.plot(a,np.cos(2*np.pi*a))
#plt.axis([-1,6,-2,2]) #设置x和y刻度范围
plt.xlim([-1,6]) #设置x刻度范围
plt.ylim([-2,2]) #设置y刻度范围
plt.xticks(np.arange(-1,6,1)) #设置显示的刻度
plt.yticks(np.arange(-2,2,1))
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=15,color='green')
plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=15,color='red')
plt.title('正弦波实例 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
plt.text(2,1.2,'$\mu=100$',fontsize=15)
plt.grid(alpha=0.6,linestyle='--',color='yellow') #调整网格透明度
plt.savefig('例6')
plt.show()

Db1f475aOW.png!large

a = np.arange(0,5,0.02)
plt.plot(a,np.cos(2*np.pi*a),color='c',linestyle='--',linewidth=1.5)
plt.axis([-1,6,-2,2])
plt.xticks(np.arange(-1,6,1))
plt.yticks(np.arange(-2,2,1))
plt.xlabel('横轴:时间',fontproperties='SimHei',fontsize=15,color='green')
plt.ylabel('纵轴:振幅',fontproperties='SimHei',fontsize=15,color='red')
plt.title('正弦波实例 $y=cos(2\pi x)$',fontproperties='SimHei',fontsize=25)
plt.annotate('$\mu=100$',xy=(2,1),xytext=(3,1.5),fontsize=15
             ,arrowprops=dict(facecolor='black',shrink=0.1,width=1))
plt.grid(alpha=0.6,linestyle='--',color='yellow')
plt.savefig('例6-1')
plt.show()

zcQDZqJiUw.png!large

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(theta, 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, markerfmt) 绘制柴火图
plt.plot_date() 绘制数据日期

常见的几种图表:

  • 饼图
  • 直方图
  • 条形图
  • 散点图
  • 折线图

饼图

# 设置中文字体和负号正常显示
matplotlib.rcParams['font.family']='FangSong'
matplotlib.rcParams['axes.unicode_minus']=False
matplotlib.rcParams['font.size']=13
"""
绘制饼图
explode:设置各部分突出
labels:设置各部分标签
labeldistance:设置标签文本距圆心位置,1.1表示1.1倍半径
autopct:设置圆里面文本
shadow:设置是否有阴影
startangle:起始角度,默认从0开始逆时针转
pctdistance:设置圆内文本距圆心距离
"""
labels = ['衣', '食', '住', '行']
sizes = [14.55,30.45,45,10]
colors = ['red', 'yellow', 'lightskyblue', 'green']
explode = (0, 0.1, 0, 0)
# 设置图片大小
plt.figure(figsize=(7, 4), dpi=80)
# 绘制饼状图图
plt.pie(sizes, labels=labels, colors=colors, explode=explode,labeldistance = 1.1, pctdistance = 0.6,autopct='%.2f%%', shadow=False, startangle=90)
plt.axis('equal') #使饼状图的xy轴长度相等
plt.legend(loc='best')
plt.savefig('饼状图')
plt.show()

nuc0TQVdC3.png!large

直方图

np.random.seed(0)
mu,sigma = 100,20
data = np.random.normal(mu,sigma,size=100)
"""
绘制直方图
data:必选参数,绘图数据
bins:直方图的长条形数目,可选项,默认为10
normed:是否将得到的直方图向量归一化,可选项,默认为0,代表不归一化,显示频数。normed=1,表示归一化,显示频率。
facecolor:长条形的颜色
edgecolor:长条形边框的颜色
alpha:透明度
histtype:直方图类型:'bar', 'barstacked','step', 'stepfilled'
"""
plt.hist(data, bins=20, normed=0, histtype='bar', facecolor='g',edgecolor="black", alpha=0.6)
# 显示横轴标签
plt.xlabel("区间", fontproperties='SimHei', fontsize=12)
# 显示纵轴标签
plt.ylabel("频数/频率", fontproperties='SimHei', fontsize=12)
# 显示图标题
plt.title('频数/频率分布直方图', fontproperties='SimHei')
plt.savefig('直方图')
plt.show()

QFo4io6Ikr.png!large

条形图的绘制

matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False

label_list=['2015', '2016', '2017', '2018'] #横坐标刻度显示值
num_list1=[20,30,15,35] # 纵轴坐标值1
num_list2=[15,30,40,20] #纵轴坐标值2
x = range(len(num_list1))
"""
绘制条形图
x:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
plt.figure(figsize=(8, 5), dpi=80)
rects1 = plt.bar(x, height=num_list1, width=0.4, alpha=0.7, color='red', label='测量部')
rects2 = plt.bar([i+0.4 for i in x], height=num_list2, width=0.4, alpha=0.7, color='blue', label='人事部')
plt.ylim(0, 50)
plt.ylabel('人数')
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index+0.2 for index in x], label_list)
plt.xlabel('年份')
plt.title('某测绘公司')
#编辑文本
for rect in rects1:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2, height+1, str(height), ha='center', va='bottom')
for rect in rects2:
    height = rect.get_height()
    plt.text(rect.get_x()+rect.get_width()/2, height+1, str(height), ha='center', va='bottom')
plt.legend()
plt.savefig('条形图')
plt.show()

9av8C2e0HJ.png!large

水平条形图的绘制
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False

price = [39.5,44.2,36.7,38.9,33.33]
"""
绘制水平条形图方法barh
参数一:y轴
参数二:x轴
"""
plt.figure(figsize=(8, 5), dpi=80)
_price = plt.barh(range(5),price, height=0.6, color='cyan', alpha=0.7)
plt.yticks(range(5), ['亚马逊','当当网','中国图书网','京东','天猫图书'])
plt.xlim(30, 47)
plt.xlabel('价格')
plt.title('不同平台的图书价格')
plt.grid(alpha=0.2)
#编辑文本
for x in _price:
    width = x.get_width()
    plt.text(width+1, x.get_y()+x.get_height()/2, str(width), ha='center', va='center')
plt.savefig('水平条形图')
plt.show()

cqNvwkZry4.png!large

堆叠条形图的绘制

matplotlib.rcParams['font.family']='SimHei'
matplotlib.rcParams['axes.unicode_minus']=False

label_list=['2015', '2016', '2017', '2018'] #横坐标刻度显示值
num_list1=[20,30,15,35] # 纵坐标值1
num_list2=[15,30,40,20] #轴坐标值2
x = range(len(num_list1))
"""
绘制条形图
x:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
plt.figure(figsize=(8, 6), dpi=80)
rects1 = plt.bar(x, height=num_list1, width=0.6, alpha=0.7, color='red', label='测量部')
rects2 = plt.bar([i for i in x], height=num_list2, width=0.6, alpha=0.7, color='blue', label='人事部', bottom=num_list1)
plt.ylim(0, 90)
plt.yticks(np.arange(0, 90, 15))
plt.ylabel('人数')
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks([index for index in x],label_list)
plt.xlabel('年份')
plt.title('某测绘公司')
plt.legend()
plt.grid(alpha=0.3)
plt.savefig('堆叠条形图')
plt.show()

JJFpgNbB7V.png!large

散点图的绘制

方法一:使用plt.scatter()函数

plt.figure(figsize=(10, 4),dpi=80)
np.random.seed(1)
a=10 * np.random.randn(100)
b=10 * np.random.randn(100)
plt.scatter(a, b, c='red', marker='o', alpha=0.8)
plt.scatter(0.8*a, 2*b, c='cyan', marker='^')
plt.title('scatter1')
plt.savefig('scatter1')
plt.show()

Fq5z4CrTjz.png!large

方法二:使用plt.plot()函数

plt.figure(figsize=(10, 4),dpi=80)
np.random.seed(1)
a=10 * np.random.randn(100)
b=10 * np.random.randn(100)
c=10 * np.random.randn(100)
d=10 * np.random.randn(100)
plt.plot(a, b, 'go', c, d, 'b^')
plt.title('scatter2')
plt.savefig('scatter2')
plt.show()

hKGVFoSoBw.png!large

折线图的绘制

注意:使用plt.plot()函数,若离散的 y 与 x 的长度相同;若 y 为连续函数则可以与 x 长度不同。

matplotlib.rcParams['font.family']='SimHei'
a=np.arange(0, 30, 1)
print(a)
data=np.random.uniform(0, 30, 30).reshape(30)
print(data)
data0=np.random.uniform(0, 30, 30).reshape(30)
print(data0)
plt.plot(a, data, 'g--*', a, data0,'r:.')
plt.ylabel('y')
plt.savefig('plot', dpi=600)
plt.show()

uqyGLyTPpt.png!large

本作品采用《CC 协议》,转载必须注明作者和本文链接
不要试图用百米冲刺的方法完成马拉松比赛。
讨论数量: 1

霸帖了!!!

3年前 评论
Galois (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!