python Matplotlib库基础

目录

  • Matplotlib 数据可视化入门
    • Pyplot 绘图
        • 自定义配置文件 rcParams
        • 创建绘图窗口
        • 绘制子图
        • 绘制饼图
        • 绘制折线图
        • 绘制条形图
        • 绘制散点图
            • 绘制热点图
        • 绘制箱型图
        • 绘制分类图背景
        • 显示绘图窗口
    • DataFrame 绘图
        • 堆叠柱状图
        • 面积图
        • 六边形分箱图
    • 附录
        • fmt 参数具体用法

Matplotlib 数据可视化入门

注意:使用Matplotlib 库之前建议先掌握一定 NumPy 库和 Pandas 库知识。
使用 Matplotlib 库应先导入 matplotlib 包下 pyplot 模块,习惯性,我们将导入后的模块重新命名为 plt 。或者直接导入 matplotlib 包,习惯性,我们将导入后的包重新命名为 mpl 。

import matplotlib.pyplot as plt
import matplotlib as mpl

实际上,Pandas 库的 DataFrame 类本身也具有画图方法。因此,接下来会分为基于 matplotlib 的数据可视化和基于 dataframe 的数据可视化分别介绍。
注意,无论使用哪种绘图方法,都需要用 pandas 库读取数据并保存在数据框中,都需要用 matplotlib 库将图显示出来。

注意:如果用 JupyterLab 进行画图,还需要添加如下代码:

%matplotlib inline

Pyplot 绘图

自定义配置文件 rcParams

plt.rcParams 是一个类似于字典的对象,保存了自定义图形窗口的所有配置,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。我们可以用修改字典的方式修改 plt.rcParams 中保存的配置信息。
最常用的设置为:

plt.rcParams['font.sans-serif']='SimHei'
plt.rcParams['axes.unicode_minus']=False

上面一个用于设置显示中文,下面一个用于设置显示负号。
此外还有(简单举一些例子):
plt.rcParams[‘font.family’] 设置字体样式(例如 ‘YaHei Consolas Hybrid’ )
plt.rcParams[‘font.size’] 传入字符串设置字体大小(例如 ‘16’ )
plt.rcParams[‘font.weight’] = ‘normal’ 设置字体粗细(正常 ‘normal’ 和加粗 ‘bold’ )
plt.xticks(rotation=45) 设置横坐标标签旋转

创建绘图窗口

plt.figure() 函数可以用于创建绘图窗口,可以传入以下常用参数(这些参数均为可选):

参数 作用
num 传入整数或字符串。整数可以指定创建或激活对应编号窗口并保存至 number 属性,字符串可以设置该窗口标题
figsize 传入两个浮点数组成的元组,设置绘图窗口的宽和高
dpi 传入整数,设置分辨率
facecolor 传入代表颜色的字符串,设置背景色
edgecolor 传入代表颜色的字符串,设置边框颜色
clear 如果传入True,且当前窗口已经有绘图时,清空当前绘图

将 plt.figure() 返回值(画布对象)赋值给一个变量 fig ,即可利用该 fig 对象的方法对指定绘图窗口进行进一步调整和修改,而不需要再调用 plt.figure() 函数激活,具体参考该对象的 help 文档,接下来只介绍对当前激活窗口的设置和绘图。

plt.title() 函数可以传入一个字符串,将其设置为图表的标题,另外可以传入以下关键字:

参数 作用
fontdict 传入一个字典,用于设定字体的各种格式(fontsize、fontweight、color等)
loc 传入 ‘center’, ‘left’, ‘right’ 中的一个,用于设置标题位置
plt.grid() 传入 True 可以设置显示网格。
plt.xlabel(),plt.ylabel() 传入字符串设置坐标轴名称。

绘制子图

方法一:plt.subplot() 函数创建子图,返回 axes 对象,可调用所有绘图方法。
方法二:fig.add_subplot() 方法也可用于创建子图,同样也返回 axes 对象。
这两个函数(方法)都传入三位整数,代表行数、列数、子图编号。

注意:fig.add_axes 也可以绘制子图(更准确说时绘制坐标系),传入一个列表

ax2 = fig.add_axes([left,bottom,width,height])	# 左下角点的横坐标、纵坐标、子图宽度、高度

fig.add_subplot() 传入 projection 参数为 ‘polar’,可绘制极坐标系。

绘制饼图

此处参考:
python 用 matplotlib 饼图参数详解 plt.pie() by 百里希文

plt.pie() 函数用于绘制饼图,传入一个序列(数组、列表也可以,常用数据框的列属性)包含需要用于作图的数据的数值,且包含如下常用关键字参数。

参数 作用
explode 传入一个序列,包含若干个浮点数,表示每个扇形块到中心的距离(默认为0,显示为一个完整的圆)
labels 传入一个序列,包含传入的每个数据的标签
colors 传入一个序列,包含每个数据对应扇形块的颜色
autopct 传入一个格式化字符串,将数据的数值除以总数传入该格式化字符串中格式化后显示(或者传入一个函数),注意如果不传入任何东西,默认不显示数值
pctdistance 传入一个浮点数(0 ~ 1),表示扇形块数据标注的径向距离
shadow 传入 True 可绘制阴影
labeldistance 传入一个浮点数(>1),表示扇形块标签的径向距离
startangle 传入一个整数,表示初始位置所在的角度(默认水平向右为0度,逆时针计算)
radius 传入一个浮点数,表示饼图的半径,默认为1
counterclock 传入 False 可让扇形块按顺时针排列(默认逆时针)
rotatelabels 传入 True 可让标签旋转至对应扇形块的角度,默认为水平

绘制折线图

plt.plot() 函数用于绘制折线图,返回 Line2D 对象,参数格式有两种:

  1. 绘制单条折线
    plot([x], y, [fmt], *, data=None, **kwargs)
  2. 绘制多条折线
    plot([x], y, [fmt], [x2], y2, [fmt2], …, **kwargs)

其中中括号内的参数为可选的参数。

参数 作用
x 传入序列、列表类型的对象,包含各个点的横坐标数值,默认为 0~len(y)-1
y 传入序列、列表类型的对象,包含各个点的纵坐标数值
fmt 传入一个字符串,代表所绘制线条的样式(按颜色、点型、线型顺序),具体用法见附录1
data 关键字参数,传入一个具有索引功能的对象,此时 x、y 只需传入一个字符串来表示是该对象的这个索引
kwargs 中常用参数:
参数 作用
—– —–
color 设置线条的颜色,可用十六进制的RGB字符串精确设置颜色
label 设置线条的标签

plt.legend() 函数用于显示每条折线对应标签的图标,有如下三种用法:

  1. 已设置好标签情况下直接显示标签
    plt.legend()
  2. 重新设置标签,传入一个列表或元组对象,包含每条折线的标签(按折线绘制顺序)
    plt.legend(labels)
  3. 在传入标签列表参数的前面,加入一个列表或元组对象,指定每个标签对应的 line2D 对象
    plt.legend(handles, labels)

在此基础上有关键字参数 loc 传入一个字符串或整数序号用于设置标签图表的位置。

字符串 序号
‘best’ 0
‘upper right’ 1
‘upper left’ 2
‘lower left’ 3
‘lower right’ 4
‘right’ 5
‘center left’ 6
‘center right’ 7
‘lower center’ 8
‘upper center’ 9
‘center’ 10

plt.xlabel() 传入一个字符串作为横坐标标签
plt.ylabel() 传入一个字符串作为纵坐标标签

绘制条形图

plt.bar() 函数用于绘制条形图,传入两个序列或列表参数,格式为:
bar(x, height, width=0.8, bottom=None, *, align=‘center’, data=None, **kwargs)
x 为一个序列,包含所有数据的横坐标(例如日期格式的字符串,可以理解为标签),height 为每个横坐标对应的具体数值构成的序列(也就是每个条形的高度)。
此外还有如下常用关键字参数(包含 kwargs 内的):

参数 作用
width 传入0~1的浮点数,设置条形的宽度,默认为0.8
bottom 设置y轴的起始坐标
color 条形的颜色,参数格式同上文提到的
edgecolor 条形边框的颜色
linewidth 传入整数,代表条形边框的宽度为多少像素
log 传入True,设置y轴用科学计数法显示
orientation 传入两个字符串之一,默认 “vertical” 代表竖直条,传入 “horizontal” 代表水平条

plt.xlabel() 传入一个字符串作为横坐标标签
plt.ylabel() 传入一个字符串作为纵坐标标签

注:plt.barh() 可以绘制横向条形图。
注:复杂条形图和堆叠条形图,用 DataFrame 绘图更方便。

绘制散点图

plt.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=< deprecated parameter>, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)
x,y 为两个列表,传入对应点的横纵坐标列表。
部分参数功能如下:

参数 作用
s 输入一个数组,设置点的大小,数组长度可以为1或散点个数
c 输入字符串列表,设置点的颜色,列表长度可以为1或三点个数,若c为浮点数列表则需要再传入cmap参数
marker 输入一个字符串,设置散点形状
norm 输入一个浮点数列表,设置点的亮度,浮点数范围为0~1,数值越大越亮
cmap 当 c 传入 0~1 之间浮点数列表时,使用此参数,可以实现渐变色
绘制热点图

利用好绘制散点图的 s、c、cmap 参数,即可绘制热点图。
cmap传入一个字符串,得到一个颜色条,c 为从0到1的浮点数,对应于颜色条上的某个颜色。
cmap可以传入的字符串有如下:
摘自:python 画图colorbar 颜色大全 plt.cm.get_cmap by Lee_Yu_Rui
注:名字后加 _r 可以取反
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

举例如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltN = 50
plot_df = pd.DataFrame(np.random.randint(1,50,3*N).reshape(N,3),columns = list('ABC')
)
c_max = max(plot_df.C)
plot_df.plot(x='A',y='B',kind='scatter',rot=0,s=plot_df.C*10,c=plot_df.C/c_max,cmap='seismic')
plt.show()

运行结果

绘制箱型图

boxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None, usermedians=None, conf_intervals=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, manage_ticks=True, autorange=False, zorder=None, *, data=None)
x 为一维数组或二维数组,若为二维数组,则以其中每一个数组画一个箱型图。
部分参数功能如下:

参数 作用
notch 是否是凹口的形式展现箱线图,默认 False
sym 指定异常点的形状,默认为 ‘b+’
vert 是否需要将箱线图垂直摆放,默认 True,表示垂直摆放
whis 指定上下须与上下四分位的距离,默认为 1.5,表示1.5倍的四分位差
positions 指定箱线图的位置,默认为 range(1, N+1),N为箱型图个数
widths 指定箱线图的宽度,默认为0.5
meanline 是否用线的形式表示均值,默认 False,用点来表示
showmeans 是否显示均值,默认 False
showcaps 是否显示箱线图顶端和末端的两条线,默认 True
showbox 是否显示箱线图的箱体,默认 True
showfliers 是否显示异常值,默认 True
labels 传入一个字符串列表,列表长度为箱型图个数,为箱线图添加标签(在横坐标的位置)

绘制分类图背景

这个可以在画样本分类图时,同时表现出分类范围。或者在其他需要设置图的背景颜色(例如画地形图时)使用。主要需要用到 np.meshgrid() 函数用于生成网格坐标对应的 (x,y),z 保存每个坐标点代入模型 .predict() 方法得到的预测值,用 plt.pcolormesh() 函数传入坐标参数、每个坐标分类标签预测值和每个标签对应的颜色。
具体使用方法可套用下例,这里不详细讲了。

xx, yy = np.meshgrid(np.arange(x_min, x_max, .02), np.arange(y_min, y_max, .02))
z = model.predict(np.c_[xx.ravel(), yy.ravel()])
plt.pcolormesh(xx, yy, z, cmap=plt.cm.Pastel1)

cmap参数除了传入前面提到的颜色条字符串,也可以直接传入颜色条对象,或者用 mpl.colors.ListedColormap() 函数自定义对象。

import matplotlib as mpl
#传入代表颜色的字符串列表
cm_mine = mpl.colors.ListedColormap(['g', 'r', 'b']) 

显示绘图窗口

注:大多数图形都适用绘制折线图中提到的 plt.legend() 函数

plt.show() 函数可用于将绘制好的绘图窗口显示出来。
plt.savefig() 函数输入 ‘路径+文件名’ 字符串可以将绘制窗口保存为图片。

DataFrame 绘图

此处参考:
pandas.DataFrame.plot( )参数详解 by hhhooo000
df.plot() 方法也可以用于绘图,并在部分情况下优于 Pyplot 绘图。
注:Series 对象也具有此方法。
以 DataFrame 对象为例,其每一列列名作为分类标签。其每一列的具体值即为y值。若 plot 方法 subplots 参数设为 True,即按每一列分别绘制子图。
df.plot() 最重要的参数为 kind 参数,代表所绘制图的类型。有如下输入:

字符串 含义
‘line’ 折线图 (default)
‘bar’ 垂直柱状图,stacked=True时为堆叠图,stacked=False时为复杂图
‘barh’ 水平柱状图,同上
‘hist’ 直方图
‘box’ 箱型图
‘kde’ 核密度估计图,主要对柱状图添加 Kernel 概率密度线
‘density’ 和 ‘kde’ 一样
‘area’ 与x轴所围区域图(面积图)。stacked=True时,每列必须全部为正或负值,stacked=False时,对数据没有要求
‘pie’ 饼图,df 需指定Y轴或者subplots=True
‘scatter’ 散点图,df 需指定X轴Y轴
‘hexbin’ 六边形分箱图,df 需指定X轴Y轴

下面再总结 df.plot() 方法的部分参数:

参数 作用
x 传入标签或序号,指定横坐标或分类依据
y 传入标签或序号,指定纵坐标或数据数值
kind 传入字符串,指定绘图类型
figsize 传入 tuple (width, height) ,指定绘图画布大小
use_index 传入 bool,是否将 index 作为 x,默认 True
title 传入字符串或字符串列表,设置图形标题或各个子图标题
grid 传入 True 用于显示网格
legend 传入 bool,是否显示图例
style 传入列表或字典,指定每条线(数据)的显示格式
logx 或 logy 或 loglog 传入 bool,是否横/纵/每个坐标轴取对数
xticks 或 yticks 传入有序列表,设置x/y轴刻度值,对图无影响,只改变坐标轴
xlim 或 ylim 传入数值或二元数组(元组或列表),设置坐标轴最小值或范围
rot 传入整型数值,表示x轴标签旋转角度
table 传入 bool,是否在图下绘制表格
sort_columns 传入 bool,对列名称进行排序以确定绘图顺序
secondary_y 传入 True 或者一个序列,设置第二个y轴(右辅助y轴)

其他可传入参数取决于 kind,即绘图类型。一般和 Matplotlib 绘图一致,特殊情况见如下例子。

堆叠柱状图

利用 DataFrame 绘制柱状图时,可以传入参数 stacked = True,生成堆叠图。

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltplot_df = pd.DataFrame(np.random.randint(1,10,30).reshape(10,3),columns = list('ABC')
)
plot_df.plot(kind='bar',rot=0,stacked=True)
plt.show()

运行结果

面积图

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltplot_df = pd.DataFrame(np.random.randint(1,10,30).reshape(10,3),columns = list('ABC')
)
plot_df.plot(kind='area',rot=0)
plt.show()

面积图也可以堆叠
运行结果

六边形分箱图

需传入两个数组,代表一系列二维坐标,二维图上每一块颜色深浅代表这一块坐标出现的频数大小。
可以更直观地表现出二维直方图的效果,但其颜色代表频数。

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltplot_df2 = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])
# gridsize 参数越大,每个六边形大小越小,图上的六边形越多,图越精确。
plot_df2.plot.hexbin(x='a',y='b',gridsize=25)
plt.show()

运行结果

附录

fmt 参数具体用法

此处参考:
matplotlib.pyplot.plot()参数详解 by ims-
fmt 参数传入一个字符串,按颜色、点型、线型的顺序拼接而成。
颜色(可用 color 参数代替):

字符串 含义
'b' blue 蓝色
'g' green 绿
'r' red 红
'c' cyan 蓝绿
'm' magenta 洋红
'y' yellow 黄
'k' black 黑
'w' white 白
点型(可用 marker 参数代替):
字符串 含义
—– —–
'.' point marker
',' pixel marker
'o' circle marker
'v' triangle_down marker
'^' triangle_up marker
'<' triangle_left marker
'>' triangle_right marker
'1' tri_down marker
'2' tri_up marker
'3' tri_left marker
'4' tri_right marker
's' square marker
'p' pentagon marker
'*' star marker
'h' hexagon1 marker
'H' hexagon2 marker
'+' plus marker
'x' x marker
'D' diamond marker
'd' thin_diamond marker
竖线 vline marker
'_' hline marker
线型(可用 linestyle 参数代替):
字符串 含义
—– —–
'-' solid line style 实线
'--' dashed line style 虚线
'-.' dash-dot line style 点画线
':' dotted line style 点

例如 ‘ro-’ 就代表红色,数值点用圆形突出,点之间连线为实线的线条。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平