import包:
matplotlib包含有很多的模块,在具体使用的时候根据需要导入依赖的模块。通过将matplotlib包导入重命名为“mpl”,pyplot模块命名为“plt”,其中ticker为坐标轴刻度相关的模块。最基本的导入pyplot包即可。其他的包的使用在后续使用的时候逐一进行说明。
import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
全局配置:
#设定坐标洗名称title,图例legend,坐标轴名称,刻度标签的字体大小,画布大小
large = 22; med = 16; small = 12
params = {'axes.titlesize': large,
'legend.fontsize': med,
'figure.figsize': (16, 10),
'axes.labelsize': med,
'axes.titlesize': med,
'xtick.labelsize': med,
'ytick.labelsize': med,
'figure.titlesize': large}
#统一通过plt.rcParams设置
plt.rcParams.update(params)
#设置图的样式
plt.style.use('seaborn-whitegrid')
#设置中文字体
mpl.rcParams['font.family'] = ['Heiti TC']
# matplotlib具体作用是当调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,或者生成一个figure画布的时候,可以直接在你的python console里面生成图像
%matplotlib inline
创建画布 figure
- 显示创建画布
通过plt.figure()显示的创建画布,然后往画布中添加对应的坐标系
# 显示创建一个figure对象
figure = plt.figure()
#为创建的figer添加不同的坐标系,前两个参数2,1表明坐标系为2行1列的排版,最后一个参数表明为那个坐标系
axes1 = figure.add_subplot(2,1,1)
axes2 = figure.add_subplot(2,1,2)
输出如下:
- 隐式创建画布:
在执行plot()的时候首先会创建画布figure,在画布自动添加一个坐标系axes,然后根据plot()中的数据绘制对应的图像;
x = [1,2,3,4]
y = [2,4,6,8]
plt.plot(x,y)
plt.show()
输出如下:
在隐式创建的时候不需要关心画布和坐标系。隐式创建画布的时候,一个figure对象上,只能有一个axes坐标系,因此只能绘制一个图形。
plot函数使用:
函数
通常plot()函数有如下两种参数的调用形式:
plot([x], y, [fmt], *, data=None, **kwargs)
plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)
参数:
- x: x轴数据
- y: y轴数据
- fmt:fmt='[marker][line][color]' 表明图表的基本属性: 颜色(color)、点型(marker)、线型(linestyle)
- data:可索引的数据,类似dataframe对象,可选参数
- kwargs:指定透明度,线条的宽度,标签等等一系列的参数
具体详可以在官网中查询:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.plot.html?highlight=plot#matplotlib.pyplot.plot
除了plot函数外,针对不同的图形有专门的函数进行绘制。具体在后面会逐个进行介绍。
坐标轴范围
同时设定x,y两轴的范围
- 函数
plt.axis([xmin, xmax, ymin, ymax]) - 示例
# 导入模块
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(-8, 8, 80)
y = x*3
plt.plot(x, y)
# 设置轴的范围
plt.axis([-5, 5, -20, 20])
plt.show()
输出如下:
分别设置两轴的范围
- 函数:
- xlim(*args, **kwargs)
设置和获取对应坐标轴的范围
- xlim(*args, **kwargs)
left, right = xlim() # return the current xlim
xlim((left, right)) # set the xlim to left, right
xlim(left, right) # set the xlim to left, right
等价于坐标系设定set_xlim()
axes.set_xlim(left, right)
- ylim(*args, **kwargs)
设置和获取对应坐标轴的范围
bottom, top = ylim() # return the current ylim
ylim((bottom, top)) # set the ylim to bottom, top
ylim(bottom, top) # set the ylim to bottom, top
等价于坐标系设定set_ylim()
axes.set_ylim(bottom, top)
- 示例:
# 导入模块
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(-8, 8, 80)
y = x*3
plt.plot(x, y)
# 设置轴的范围
plt.xlim(-5,5)
plt.ylim(-16,16)
plt.show()
输出如下:
刻度设置:
普通刻度
- 函数:
x轴的刻度:plt.xticks(item)
y轴的刻度:plt.yticks(item) - 示例:
# 导入模块
import matplotlib.pyplot as plt
import numpy as np
# 生成数据
x = np.linspace(-8, 8, 80)
y = x*3
plt.plot(x, y)
# 设置轴的范围
plt.xticks(np.arange(-5,5,1))
plt.yticks([-15,-5,3,9,15])
plt.show()
输出如下:
添加文本的刻度
plt.xticks(['数据'], ["标签"]) 设置刻度的基础上,在添加一个列表,来显示刻度
主次刻度设置
需要导入:from matplotlib.ticker import MultipleLocator, FormatStrFormatter
- 主刻度:(x,y轴相同)
倍数:ax.xaxis.set_major_locator(MultipleLocator(倍数))
文本格式:ax.xaxis.set_major_formatter(FormatStrFormatter('%占位数.小数点数f')) - 副刻度:(x,y轴相同,将"major"改为"minor"即可)
倍数:ax.xaxis.set_minor_locator(MultipleLocator(倍数))
文本格式:ax.xaxis.set_minor_formatter(FormatStrFormatter('%占位数.小数点数f'))
# 导入模块
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
'''
生成数据
'''
x = np.linspace(-40, 40)
y = x*3
plt.plot(x, y)
ax = plt.gca()
'''
设置轴的主刻度
'''
ax.xaxis.set_major_locator(MultipleLocator(20)) # 设置20倍数
ax.xaxis.set_major_formatter(FormatStrFormatter('%2.1f')) # 设置文本格式
ax.yaxis.set_major_locator(MultipleLocator(50)) # 设置50倍数
ax.yaxis.set_major_formatter(FormatStrFormatter('%2.2f')) # 设置文本格式
'''
设置轴的副刻度
'''
ax.xaxis.set_minor_locator(MultipleLocator(10)) # 设置10倍数
ax.xaxis.set_minor_formatter(FormatStrFormatter('%2.1f')) # 设置文本格式
ax.yaxis.set_minor_locator(MultipleLocator(25)) # 设置25倍数
ax.yaxis.set_minor_formatter(FormatStrFormatter('%1.0f')) # 设置文本格式
ax.tick_params(which='minor', width=1, labelsize=10,bottom=True)
ax.tick_params(which='minor', length=2, labelsize=10, labelcolor='0.25')
plt.show()
输出如下:
图例
在plot()的时候增加labe添加文本内容,通过legend()显示出来。
示例:
import matplotlib.pyplot as plt
import numpy as np
'''
生成数据
'''
x = np.linspace(-8, 8, 80)
y = x*3
plt.plot(x, y,label="x*3")
plt.plot(x, y*1.5,label="x*4.5")
'''
loc 设定legend的位置
'''
plt.legend(loc='lower right')
plt.show()
输出如下:
spines设置
- 属性:
函数 | 说明 | 默认值 |
---|---|---|
set_visible(bool) | 边框的可见性 | True |
ax.xaxis.set_ticks_position({"top","left"……}) | 刻度的显示位置 | 外面(不是ax.spines[' '].) |
set_position({"top","left"……}) | 边框的位置 | 左下角为交点 |
set_color(string) | 边框的颜色 | “black"(当值为None也是隐藏) |
set_linewidth(int) | 边框的宽度 | 1 |
set_linestyle(string) | 边框的线性 | ”-“ |
- 箭头
导入axisartist
import mpl_toolkits.axisartist as axisartist
1、隐藏原有的边框坐标系
2、创建新的坐标系,添加箭头
3、创建新的坐标系时ax.new_floating_axis(0, 0)第一个参数:0表示横线,1表示竖线,第二个参数:表示经过那个坐标点。
import matplotlib.pyplot as plt
import numpy as np
import mpl_toolkits.axisartist as axisartist
# 生成数据
x = np.linspace(-10, 10, 80)
y = x*3
plt.plot(x, y)
ax = plt.gca()
'''
使用ax.spines[]选定边框,使用set_color()将选定的边框的颜色设为 none
'''
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
'''
移动坐标轴,将bottom即x坐标轴移动到y=0的位置
ax.xaixs为x轴,set_ticks_position()用于从上下左右(top/bottom/left/right)四条脊柱中选择一个作为x轴
使用set_position()设置边框位置:y=0的位置。位置的所有属性包括:outward、axes、data
'''
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
'''
将left 即y坐标轴设置到x=0的位置
'''
ax.yaxis.set_ticks_position('left') # 选定y轴
ax.spines['left'].set_position(('data', 0))
'''
不显示网格
'''
plt.grid( None)
plt.show()
输出如下:
多图的处理
- subplot()
plt.subplot(m,n,p)m和n代表在一个图像窗口中显示m行n列个图像,也就是整个figure中有n个图是排成一行的,一共m行,后面的p代表现在选定第p个图像区域,即在第p个区域作图
另外一种多图显示的方式参见 matplotlib可视化之直方图 扩展部分中的双变量直方图
import matplotlib.pyplot as plt
fig=plt.figure()
'''
子图1 第1行第1列
'''
ax1=fig.add_subplot(221) #2*2的图形 在第一个位置
ax1.text(0.5,0.5, 'one',ha='center',va='center',size=20,alpha=.5)
'''
子图2 第1行第2列
'''
ax2=fig.add_subplot(222)
ax2.text(0.5,0.5, 'one',ha='center',va='center',size=20,alpha=.5)
'''
子图3 第2行第1列
'''
ax3=fig.add_subplot(223)
ax3.text(0.5,0.5, 'one',ha='center',va='center',size=20,alpha=.5)
'''
子图4 第2行第2列
'''
ax4=fig.add_subplot(224)
ax4.text(0.5,0.5, 'one',ha='center',va='center',size=20,alpha=.5)
plt.show()
输出如下:
常用的对象:
- figure 画布
- axes 坐标系,一个画布上可以有多个坐标系
- axis 坐标轴,一个坐标系中可以有多个坐标轴,一般都是二维平面坐标系,或者三维立体坐标系
- title 标题
- legend 图例
- grid 背景网格
- tick 刻度
- axis label 坐标轴名称
- tick label 刻度名称
- major tick label 主刻度标签
- minor tick label 副刻度标签
- line 线
- style 线条样式
- marker 点标记
- font 字体相关