目录
- 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 对象,参数格式有两种:
- 绘制单条折线
plot([x], y, [fmt], *, data=None, **kwargs) - 绘制多条折线
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() 函数用于显示每条折线对应标签的图标,有如下三种用法:
- 已设置好标签情况下直接显示标签
plt.legend() - 重新设置标签,传入一个列表或元组对象,包含每条折线的标签(按折线绘制顺序)
plt.legend(labels) - 在传入标签列表参数的前面,加入一个列表或元组对象,指定每个标签对应的 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-’ 就代表红色,数值点用圆形突出,点之间连线为实线的线条。