Skip to content

Matplotlib

图像组成

  • tilte 标题

  • figure 画板

  • axes 画布

  • legend 图例

  • axis 轴

    • 横轴x轴
    • 纵轴y轴
  • tickes 刻度

  • ticklabels 刻度标签

  • x_label y_label 轴标签

  • annote 注释信息

导包

image-20240421161705543

获取画板

  • plt.figure(figsize=)

image-20240421202548233

获取画布

  • plt.subplot()

image-20240421202700806

就近原则

  • plt.的所有操作都是操作最近的上一个画布
  • 所有的画布,都会默认被配置在离自己最近的那个画板上

image-20240421203059004

网格线

  • 面向过程
    • plt.grid()
  • 面向对象
    • axes.grid()

image-20240421203747676

坐标轴界限

  • 默认情况是,画布刻度的边界是由绘图的数据决定的
  • 通用方式
    • axes.axis()
    • axes.axis()里传入列表,分别为x下限,x上限,y下限,y上限
  • 面向过程
    • plt.xlim()
    • plt.ylim()
  • 面向对象
    • axes.set_xlim()
    • axes.set_ylim()

image-20240421204956502

  • 通用方式

image-20240421205814101

  • 面向过程

image-20240421205917336

  • 面向对象

image-20240421210007541

设定刻度

  • 面向过程

    • plt.xticks()plt.yticks()
    • 需指定刻度值和刻度label plt.xticks([刻度列表],[label列表])
  • 面向对象

    • axes.set_xticks()axes.set_yticks()
    • axes.set_xtickslabel()axes.set_ytickslabel()
  • 支持fontsize、rotation、color等参数设置

image-20240421210935790

image-20240421211019990

坐标轴标签

  • 面向过程
    • plt.xlabel()plt.ylabel()
  • 面向对象
    • axes.set_xlabel()axes.set_ylabel()

image-20240421211403059

image-20240421211430084

通用的外观设计

  • color: 颜色
  • fontsize: 字体大小
  • rotation: 旋转角度

画布标题

  • 面向过程
    • plt.title()
  • 面向对象
    • axes.set_title()

image-20240421211626985

image-20240421211650087

图例

  • 面向过程
    • plt.legend()
  • 面向对象
    • axes.set_legend()

两种传参方式

  • 分别在plot函数中增加label参数,再调用legend()方法显示

  • 直接在legend方法中传入字符串列表

面向过程

分别在plot函数中增加label参数,再调用legend()方法显示

image-20240422133202431

直接在legend方法中传入字符串列表

image-20240422133303564

面向对象

image-20240422133552317

loc参数

  • loc参数用于设置图例标签的位置,一般在legend函数内
  • matplotlib已经预定义好几种数字表示的位置
字符串数值字符串数值
best0center left6
upper right1center right7
upper left2lower center8
lower left3upper center9
lower right4center10
right5

image-20240422134201472

loc参数还可以是2元素的元组,使用相对位置来表示图例左下角的坐标

  • [0,0] 左下
  • [0,1] 左上
  • [1,0] 右下
  • [1,1] 右上

image-20240422134958696

ncol参数

  • ncol控制图例中有几列,在legend中设置ncol,需要设置loc

image-20240422135102392

Linestyle,color,marker

  • 修改线条样式

图像保存

  • plt.savefig('路径',dpi=像素(int),facecolor='green')
  • 画板figure对象的颜色不会被保存到本地
    • 要搞颜色在savefig里设置

image-20240422140846804

保存后的图片会显示设置的facecolor

image-20240422140929938

添加注释(Annote)

  • test()

  • subtitle()

  • figtest()

  • annotate()

添加文字的方法:

pyplot函数API方法描述
text()mpl.axes.Axes.text()在Axes对象的任意位置添加文字
figtext()mpl.figure.Figure.text()在Figure对象的任意位置添加文字
suptitle()mpl.figure.Figure.suptitle()为Figure对象添加中心化的标题
annotate()mpl.axes.Axes.annotate()为Axes对象添加注释(箭头可选)

所有的方法会返回一个matplotlib.text.Text对象

图形内的文字

  • text()

    • x/y:位置参数

      • 绝对位置
      • 相对位置
    • s:文本信息

    • fontdict:字体参数设置,字典

image-20240422142651660

画板上添加文字

  • figtest()
    • 用法和test()完全一致,不赘述

添加画板标题

  • subtitle()

    • x/y:位置参数

      • 绝对位置
      • 相对位置
    • t:文本内容

图像同上

添加箭头注释

  • annonate()

    • text:文本内容

    • xy:箭头指向点的坐标,传入元组

    • xytest:文字放置位置,元组

    • arrowprops:箭头属性,字典,不写就用默认的箭头样式

    • width参数设置箭头长方形部分的宽度

    • headlength参数设置箭头尖端的长度,

    • headwidth参数设置箭头尖端底部的宽度

    • shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值),可以理解为控制箭头的长度

image-20240422143933394

image-20240422144007792

轴 axis

image-20240422164523593

image-20240422164555856

画双轴图

python
# 画图
fig = plt.figure(figsize=(12,8))

ax1 = plt.subplot(111)
ax1.plot(temp['ym'],temp['ym_revenue(百万円)_東開店'],label = '東開店',color='darkgreen')
ax1.plot(temp['ym'],temp['ym_revenue(百万円)_名古屋茶屋店'],label = '名古屋茶屋店',color='brown')
ax1.set_xlabel('date')
ax1.set_ylabel('飲料売上')

ax2 = ax1.twinx()
ax2.plot(temp['ym'],temp['diff'],label = 'diff')
ax2.set_ylabel('東開店の売上 - 名古屋茶屋店の売上')

fig.legend(["東開店売上", "名古屋茶屋店売上", "diff"],loc=(0.65,0.85))


plt.title('年月別の飲料売上金額')

image-20240522110553707

图像展示

  • plt.imshow()
    • 传入图片路径
  • plt.imread()
    • 传入一个三维数组

image-20240422165650829

image-20240422165912878

风格和样式设置

python
# plot语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色、线型、点型等要素,语法形式为:  

plt.plot(X, Y, 'format', ...)

颜色的各种表达方式

  • 别名

    • color='r'
  • 合法的HTML颜色名

    • color = 'red'
颜色别名HTML颜色名颜色别名HTML颜色名
蓝色bblue绿色ggreen
红色rred黄色yyellow
青色ccyan黑色kblack
洋红色mmagenta白色wwhite
  • HTML十六进制字符串

    • color = '#eeefff'
  • 归一化到[0, 1]的RGB元组

    • color = (0.3, 0.3, 0.4)

image-20240422163909414

image-20240422164057902

image-20240422164129534

透明度

  • alpha参数
  • 0.0 ~ 1.0 float

image-20240422164236532

背景色

  • 设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标系的背景色

image-20240422164322448

image-20240422164356886

点和线的样式

线型

  • 参数为
    • linestyle
    • ls
线条风格描述线条风格描述
'-'实线':'虚线
'--'破折线'steps'阶梯线
'-.'点划线'None' / ','什么都不画

image-20240422170032156

线宽

  • 参数为
    • linewidth
    • lw

image-20240422170150054

不同宽度的破折线

  • 使用dashes参数 ,传入列表,为破折号序列各段的宽度
  • 比如:
    • dashes = [5,1,2,1]
    • 一段线长为5,空白长为2,线长为2,空白长1,重复。

image-20240422171028686

点型

  • marker 设置点形
  • markersize 设置点形大小
标记描述标记描述
'1'一角朝下的三脚架'3'一角朝左的三脚架
'2'一角朝上的三脚架'4'一角朝右的三脚架
's'正方形'p'五边形
'h'六边形1'H'六边形2
'8'八边形
'.''x'X
'*'星号'+'加号
','像素
'o'圆圈'D'菱形
'd'小菱形'','None',' ',None
'_'水平线'|'竖线
'v'一角朝下的三角形'<'一角朝左的三角形
'^'一角朝上的三角形'>'一角朝右的三角形

image-20240422170316833

更多点和线的设置

  • markersize = 20
  • markeredgecolor = 'green',
  • markeredgewidth = 2,
  • markerfacecolor = 'purple'

对实例使用一系列的set方法

  • plt.plot()方法返回一个包含所有线的列表,设置每一个线需要获取该线对象
    • eg: lines = plt.plot(); line = lines[0]
    • line.set_linewith()
    • line.set_linestyle()
    • line.set_color()

对坐标系使用一系列的set方法

  • axes = plt.subplot()获取坐标系
    • set_title()
    • set_facecolor()
    • set_xticks、set_yticks 设置刻度值
    • set_xticklabels、set_yticklabels 设置刻度名称

image-20240422171530570

推荐的绘图方式

image-20240422171625601

不推荐的绘图方式,但得了解

多参数连用

  • 颜色、点型、线型,可以把几种参数写在一个字符串内进行设置 ,比如 'r-.o'

多个曲线同一设置

  • 属性名声明,不可以多参数连用

  • plt.plot(x1, y1, x2, y2, fmt, ...)

image-20240422171340542

多个曲线不同设置

多个曲线都进行设置时,多参数连用

plt.plot(x1, y1, fmt1, x2, y2, fmt2, ...)

Matplotlib 2D绘图

线型图

俩参数x,y,适用于:

  • 连续数据
  • 时间序列

强调连续性,变化趋势,一个变量随着另一个变量的变化规律。

kind参数可以选择线的种类

image-20240423131219596

image-20240423131254825

image-20240423131327640

image-20240423131518708

image-20240423131551501

散点图

  • scatter()

  • 【散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标】

  • 关注离散数据,变量与变量之间的关系

  • 线性图是有序的,散点图是无序的

  • scatter可以表达四维,x,y,大小,颜色

image-20240423133350917

image-20240423133521960

image-20240423133551702

直方图

  • hist()

  • 最常用于查看数据的分布情况,和最普通的数据可视化也可以用hist

  • 参数只有一个x!!!数据的频数(y轴)统计。

  • hist()的参数

    • bins

      • 可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10
    • density

      • 如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False,
      • 结合plt.plot(kind='kde')一起画
    • color

      • 指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色
    • orientation

      • 通过设置orientation为horizontal创建水平直方图。默认值为vertical

image-20240423134931387

image-20240423135012972

举个例子

  • 查看不同类别的店铺的面积分布情况
  • image-20240521150009039

条形图(柱状图)

  • bar() , barh()

  • 条形图有两个参数x,y

  • width 纵向设置条形宽度

  • height 横向设置条形高度

  • 比较数据的大小关系,强调比较

普通条形图

image-20240423140105600

image-20240423140359063

image-20240423140651295

堆叠条形图

image-20240423141532393

方法一:plt.plot() (这好,用这个)

  • 直接df.plot(kind = 'bar',stacked = True)

  • 数据长下面这个样子:

    image-20240524103734574

  • 画堆叠图长下面这样

image-20240531200011299

python
ax = store_revenue_rate.plot(kind='bar',stacked=True)

plt.ylabel('比率(%)')
plt.legend(loc=(0.9,0.65))
plt.title('店別の飲料ディビジョン全体における部門別売上構成比')
plt.xticks(rotation = 0)


# 在堆叠图上显示百分比
for container in ax.containers:
    ax.bar_label(container, fmt='%.1f%%', label_type='center')

方法二:plt.bar()

image-20240423141600719

簇状条形图

方法一:plt.plot() (这个好用这个)

image-20240423142304787

方法二:plt.bar()

image-20240423142356355

极坐标条形图(玫瑰图)

  • 创建极坐标,设置polar属性

    • plt.axes(polar = True)
  • 0-2 π是极坐标唯一一个轴的取值范围。

  • 本质是极坐标 + 条形图

image-20240423142656055

image-20240423143458605

python
# 0-2Π 是极坐标唯一一个轴的取值范围,永远不会变
plt.axes(polar=True)

data = np.random.randint(10, 20, size=8)

plt.bar(x=np.linspace(0, 2*np.pi, 8, endpoint=False), 
        height=data, color=np.random.random(size=(8, 3)),
       width=0.8, align='edge')

雷达图

  • 本质是极坐标 + 线性图

image-20240423144833999

image-20240423144922968

python
index = ['A','B','C','D']

data1 = np.random.randint(10, 100, size=(4))
data2 = np.random.randint(10, 100, size=(4))

# 为了解决图像不闭合
data11 = np.append(data1, data1[0])
data22 = np.append(data2, data2[0])

# 为了解决标签分布不均匀的问题
x = np.linspace(0, 2*np.pi, 4, endpoint=False)
xx = np.append(x, x[0])

plt.axes(polar=True)

# 修改为闭合的图像
plt.plot(xx, data11)
plt.plot(xx, data22)

_ = plt.xticks(x, index)

饼图

  • pie()
  • 饼图也只有一个参数x!!!
  • 同时表达:
    • 两组数据的对比
    • 各子数据的占比情况
  • 饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小
    • labels参数设置每一块的标签;
    • labeldistance参数设置标签距离圆心的距离(比例值,只能设置一个浮点小数)
    • autopct参数设置比例值的显示格式(%1.1f%%);
    • pctdistance参数设置比例值文字距离圆心的距离
    • explode参数设置每一块顶点距圆形的长度(比例值,列表);
    • colors参数设置每一块的颜色(列表);
    • shadow参数为布尔值,设置是否绘制阴影
    • startangle参数设置饼图起始角度
python
# 填满的饼图
data = np.array([30, 60, 45])
index = ['A','B','C']

_ = plt.pie(data, labels=index, labeldistance=1.1, autopct='%1.1f%%', 
            pctdistance=0.5, explode=[0, 0, 0.1], colors=np.random.random(size=(3,3)),
           shadow=True, startangle=10)
_ =plt.axis('equal')

image-20240423145727012

python
# 不填满的饼图, 保证展示的数据的和不要超过1

data = np.array([30, 60, 45])[:2]
index = ['A','B','C']

_ = plt.pie(data, labels=index[:2], labeldistance=1.1, autopct='%1.1f%%', 
            pctdistance=0.5, explode=[0, 0.1], colors=np.random.random(size=(3,3)),
           shadow=True, startangle=10)
_ =plt.axis('equal')

image-20240423145953068

箱线图

image-20240423150235177

  • plt.boxplot()

  • 参数说明:

    • x, # 指定要绘制箱线图的数据;

    • ​ notch=None, # 是否是凹口的形式展现箱线图,默认非凹口;

    • ​ sym=None, # 指定异常点的形状,默认为+号显示;

    • ​ vert=None, # 是否需要将箱线图垂直摆放,默认垂直摆放;

    • ​ whis=None, # 指定上下须与上下四分位的距离,默认为1.5倍的四分位差;

    • ​ positions=None, # 指定箱线图的位置,默认为[0,1,2…];

    • ​ widths=None, # 指定箱线图的宽度,默认为0.5;

    • ​ patch_artist=None, # 是否填充箱体的颜色;

    • ​ meanline=None, # 是否用线的形式表示均值,默认用点来表示;

    • ​ showmeans=None, # 是否显示均值,默认不显示;

    • ​ showcaps=None, # 是否显示箱线图顶端和末端的两条线,默认显示;

    • ​ showbox=None, # 是否显示箱线图的箱体,默认显示;

    • ​ showfliers=None, # 是否显示异常值,默认显示;

    • ​ boxprops=None, # 设置箱体的属性,如边框色,填充色等;

    • ​ labels=None, # 为箱线图添加标签,类似于图例的作用;

    • ​ flierprops=None, # 设置异常值的属性,如异常点的形状、大小、填充色等;

    • ​ medianprops=None, # 设置中位数的属性,如线的类型、粗细等;

    • ​ meanprops=None, # 设置均值的属性,如点的大小、颜色等;

    • ​ capprops=None, # 设置箱线图顶端和末端线条的属性,如颜色、粗细等;

    • ​ whiskerprops=None, # 设置须的属性,如颜色、粗细、线的类型等

image-20240423150614310

全局设置

python
# 字号设置为20
plt.rcParams['axes.titlesize'] = 20

# 对画布颜色进行全局的配色,为绿色
plt.rcParams['axes.facecolor'] = 'lightgray'
# 'lines.linestyle': '-',
# 'lines.linewidth': 1.5,

plt.rcParams['lines.linestyle'] = '--'
plt.rcParams['lines.linewidth'] = 3
python
# 汉字
plt.rcParams['font.sans-serif'] = 'SimHei'
# 负号
plt.rcParams['axes.unicode_minus'] = False

#日语
plt.rcParams['font.family'] = 'Hiragino Sans GB'
sns.set(font='IPAexGothic')
python
# 显示所有行
pd.set_option('display.max_rows',None)

#显示所有列
pd.set_option('display.max_columns',None)

#过滤warning
warnings.filterwarnings('ignore')

加载自定义字体

python
from matplotlib import font_manager

# 需要下载ttf格式的字体文件 
fp = font_manager.FontProperties(fname='./蒙纳超刚黑简.ttf')

plt.title('中国是一个强悍的发展中国家', fontproperties = fp, fontsize=20)

杂七杂八

matplotlib的设置默认字体

python
plt.rcParams['font.sans-serif'] = ['Arial', 'sans-serif']

# 配置绘图的位置为当前画布内(可以不写,但是建议写)
%matplotlib inline

matplotlib不显示科学记数法

python
plt.ticklabel_format(axis='y', style='plain')

put.show()

  • 强制将当前绘图信息渲染到最近的画布上

面向过程plt.xxx

面向过程的风格全部遵循最近原则

魔法指令

python
# 如果画图不显示,试试这个
%matplotlib inline

# 交互式画图的魔法指令
%matplotlib widget

image-20240427173838951