基本绘图
- 库导入
import matplotlib.pyplot as plt
import numpy as np
- 散点图(scatter)
# 函数API
plt.scatter(x,y,c,s,marker,alpha)
"""参数解析:c -- 颜色
s -- 点的大小
marker -- 点的样式
alpha -- 透明度
"""
# 面向对象
ax.scatter(x,y,c,s,marker,alpha)
- 折线图
# 函数API
plt.plot(x,y,color,linestyle,marker,markerfacecolor,markersize)
"""参数解析:color -- 线的颜色
linestyle -- 线的类型
marker -- 点的形状
markerfacecolor -- 点的颜色
markersize -- 点的大小
"""
plt.plot_date() # 专门绘制某个轴为日期类型的数据
# 面向对象
ax.plot(x,y,color,linestyle,marker,markerfacecolor,markersize)
ax.plot_date()
- 条形图
# 函数API
# 默认绘制垂直直方图
plt.bar(x,height,width,bottom,color)
"""常用参数:x -- 每个条的x坐标位置
height -- 条的高度
width -- 条的宽度
bottom -- y坐标的起始基准值,用于绘制多组数据
color -- 条的颜色
tick_label -- 在每个条的底部添加标签,x轴方向
"""
# 绘制水平直方图
plt.barh(y,width,height,left,color)
"""常用参数:
y -- 每个条的y坐标位置
width -- 条的宽度,相当于bar函数的高度
height -- 条的高度,相当于bar函数的宽度
left -- x坐标的起始基准值,相当于bar函数的bottom
color -- 条的颜色
tick_label -- 在每个条的底部添加标签,y轴方向
"""
# 面向对象
ax.bar(x,height,width,bottom,color)
ax.barh(y,width,height,left,color)
- 直方图
# 函数API
# 一维直方图:观察变量的分布情况
plt.hist(x,bins,color,normed)
"""常用参数:
x -- 输入数据
bins -- 等间隔划分的条数
colot -- 颜色
normed -- 是否标准化
"""
# 二维直方图:观察两个变量的联合分布
plt.hist2d(x,y,bins)
"""常用参数:
x,y -- 输入数据
bins -- 等间隔划分的条数
"""
# 面向对象
ax.hist(x,bins,color,normed)
ax.hist2d(x,y,bins)
- 饼状图
# 函数API
plt.pie(x,explode,labels,colors,autopct,shadow)
"""常用参数:
x -- 输入数据
explode -- 距离数组,每部分与中心的距离
labels -- 标签数组
colors -- 颜色数组
autopct -- 百分比标注,格式:“% 2.2f% %”
shadow -- 添加阴影
注:默认绘制的是椭圆形的饼图,如绘制圆形饼图,需要把两个轴的尺度相同
在绘图前调用plt.axes(aspect=1)可实现
"""
# 面向对象
ax.pie(x,explode,labels,colors,autopct,shadow)
- 箱形图
# 函数API
plt.boxplot(x,notch,sym,vert,whis)
"""常用参数:
x -- 输入数据
notch -- 是否带开槽
sym -- 外点的形状
vert -- 是否垂直绘制
whis -- 箱子两端的加长长度
"""
# 面向对象
ax.boxplot(x,notch,sym,vert,whis)
- 极坐标图
"""极坐标系绘图"""
# 函数API
plt.polar(theta,r)
# 面向对象
ax = plt.subplot(111,projection="polar")
颜色和线型
- 颜色
常规颜色:‘b’, ‘g’, ‘r’, ‘c’, ‘m’, ‘y’, ‘k’, ‘w’
16进制RGB表示:’#ffabff’ 除#号外每两个字符表示一个颜色通道通道
RGB颜色:(0,0.5,0.7) 每个颜色取值在[0-1]之间
官方手册查询关键字:matplotlib.colors
"""常规颜色"""
color = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w']
"""16进制RGB颜色"""
color = '#FFABFF' # '#ffabff' ,此处不区分大小写一样
"""浮点RGB颜色"""
color = (0.1,0.5,0.8)
"""颜色映射"""
colormap = matplotlib.colors.ListedColormap(list("bgrc")) # 参数为list,或者array
# 注:可用于绘图函数中带cmap参数的赋值,实现不同类别的颜色区分
x,y = sklearn.datasets.make_blobs(n_samples=500,n_features=2,centers=5) # 生成500带标签的数据,x为数据,y为标签,类别个数5
xf1,xf2 = x[:,0],x[:,1]
plt.scatter(xf1,xf2,c=y,cmap=colormap,s=30)
plt.show()
# 效果如下图所示
2. 点的样式
更多样式请参考官方手册
官方手册查询关键字:matplotlib.markers
3. 线的类型
常规线型:直线,点线,虚线,点画线
更多线型请参考官方手册
官方手册查询关键字:linestyles
子图创建
- 系统创建子图
系统创建子图会根据子图个数等分画布,创建的子图每个大小相等
# 函数API
plt.subplot(111)
# 面向对象
fig.add_subplot(111)
- 自定义创建子图
自定义子图如下图所示,可根据需要在不同位置,绘制指定大小的子图
"""创建自定义轴对象Axes"""
fig = plt.figure()
rect=[left,bottom,width,height] # rect 表示axes对象在画布中的位置及大小
ax = fig.add_axes(rect) # 这种方式可实现灵活的布局
面向对象绘图
面向对象绘图可实现灵活在一个图对象中添加多个子图,以及创建多个图对象
fig = plt.figure(figsize=(16,9)) # 创建图像对象,每次调用可创建一个图对象
ax1 = fig.add_subplot(231) # 添加子图 231表示2行3列第1位置的子图
ax2 = fig.add_subplot(232)
ax3 = fig.add_subplot(233)
ax4 = fig.add_subplot(234)
ax5 = fig.add_subplot(235)
ax6 = fig.add_subplot(236)
x1 = np.random.randint(-20,20,50)
y1 = x1**2
ax1.set_title("ax1_scatter",size=15)
ax1.scatter(x1,y1,c="r",s=10,marker="o",alpha=0.7)
x2 = np.linspace(0,2*np.pi,50)
y2 = np.sin(x2)
ax2.set_title("ax2_plot",size=15)
ax2.plot(x2,y2,color="b",linestyle="solid",marker="x",markerfacecolor="r",markersize=5)
x3 = np.arange(20)
y3 = np.random.randint(50,300,20)
ax3.set_title("ax3_bar",size=15)
ax3.bar(x3,height=y3,width=0.5,bottom=0,color="g")
ax3.bar(x3,height=y3-x3,width=0.5,bottom=y3,color="y")
x4 = np.random.randn(500)
ax4.set_title("ax4_hist",size=15)
ax4.hist(x4,bins=50,color="c",normed=True)
x5 = [42,86,94,37,85]
ax5.set_title("ax5_pie",size=15)
ax5.pie(x5,explode=(0,0.05,0.1,0,0.05),labels=["clothes","learn","work","food","game"],autopct="% 2.2f% %",shadow=True)
x6 = np.random.randn(100)
ax6.set_title("ax6_boxplot",size=15)
ax6.boxplot(x6,notch=True,sym="p")
plt.show()
坐标轴操作
- 设置坐标轴范围
"""设置坐标轴范围"""
# 函数API
plt.axis(xlim=(xmin,xmax),ylim=(ymin,ymax)) # 指定x轴和y轴的范围
plt.xlim(xmin,xmax)
plt.ylim(ymin,ymax)
# 面向对象
ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax))
ax.set_xlim(xmin,xmax)
ax.set_ylim(ymin,ymax)
- 设置坐标轴刻度
"""设置坐标轴刻度"""
# 函数API
plt.xticks(ticks,labels) # 可同时指定刻度值及对应标签,二者长度需一致
plt.yticks(ticks,labels)
# 面向对象
ax.set_xticks(ticks)
ax.set_yticks(ticks)
- 设置坐标轴刻度标签
# 函数API
plt.xticks(ticks,labels) # 可同时指定刻度值及对应标签,二者长度需一致
plt.yticks(ticks,labels)
# 面向对象
ax.set_xticklabels(labels) # lables长度需与tick长度一致
ax.set_yticklabels(labels)
- 设置坐标轴标签
# 函数API
plt.xlabel(xlabel) # x轴标签
plt.ylabel(ylabel) # y轴标签
# 面向对象
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
- 添加孪生坐标轴
"""添加坐标轴"""
# 函数API
ax1 = plt.twinx(ax) # 为ax添加共享x轴的y轴
ax2 = plt.twiny(ax) # 为ax添加共享y轴的x轴
# 面向对象
ax1 = ax.twinx()
ax2 = ax.twiny()
图像文本操作
- 中文字符显示
"""方法1:使用时改变"""
import matplotlib
font=matplotlib.font_manager.FontProperties(fname=r"C:\Windows\Fonts\STXINGKA.TTF",size=15) # fname为系统自带字体库路径
plt.title("标题",fontproperties=font) # 通过指定fontproperties参数使用,没设置改参数将不做改变
"""方法2:全局改变"""
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 相应的字体库,具体查询手册
matplotlib.rcParams['axes.unicode_minus'] = False
- 文本绘制
"""Axes对象绘制:Axes对象所在区域位置"""
# 函数API
plt.title() # 设置标题
plt.text() # 普通文本注释
plt.annotate() # 带箭头注释
# 面向对象
ax.set_title() # 设置轴对象标题
ax.text() # 普通文本注释
ax.annotate() # 带箭头注释
"""figure对象绘制:画布的任意位置"""
# 函数API
plt.figtext() # 普通文本注释
plt.suptitle() # 设置画布标题
# 面向对象
fig.figtext()
fig.suptitle()
- 公式绘制
"""公式绘制可用任意可标注文本的函数或方法实现,只需要采用Tex格式书写字符串即可"""
s = r"$ \int_a^b $" # 开头结尾用$号,中间为公式内容 具体写法查询手册mathtext部分内容
plt.text(x,y,s)
其他功能
"""添加网格"""
plt.grid(b,color,linestyle,linewidth,alpha) # 具体参数查手册matplotlib.pyplot.grid
ax.grid(...)
"""添加图例"""
plt.legend() # 具体用法参见手册matplotlib.pyplot.legend
ax.legend()
"""区域填充"""
plt.fill(x,y,color,alpha)
plt.fill_between(x,y1,y2,where) # y2可以是标量scalar,where可以指定条件如where=(y1>y2),表示填充y1>y2的情况
"""绘制图形"""
import matplotlib.patches as mpatches
circle = mpathces.Circle() # 绘制圆
ax.add_patch(circle) # 详细信息查看https://matplotlib.org/api/patches_api.html?highlight=patches#module-matplotlib.patches
"""图形美化"""
plt.style.use(style)
# 所有可用风格,可用plt.style.available 获取
# ['bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn-bright', 'seaborn-colorblind',
# 'seaborn-dark-palette', 'seaborn-dark', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', # 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'seaborn',
# 'Solarize_Light2', 'tableau-colorblind10', '_classic_test']
"""创建自定义轴对象Axes"""
fig = plot.figure()
rect=[left,bottom,width,height] # rect 表示axes对象在画布中的位置及大小
ax = fig.add_axes(rect) # rect=[left,bottom,width,height] # 通过这种方式可实现灵活的布局,而不像subplot生成的自动对齐的axes对象
"""在x轴旋转显示日期数据"""
fig = plt.figure()
fig.autofmt_xdate() # 详细用法参见手册
"""设置arist对象的属性"""
plt.setp() # 详细用法参见手册
"""画布自动布局"""
plt.tight_layout(rect=(0,0,1,0.96)) # rect = (left,bottom,right,top) 表示布置的范围
fig.tight_layout(rect=(0,0,1,0.96))