python Matplotlib库基础

目录

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传入一个浮点数,表示饼图的半径,默认为1counterclock传入 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)-1y传入序列、列表类型的对象,包含各个点的纵坐标数值fmt传入一个字符串,代表所绘制线条的样式(按颜色、点型、线型顺序),具体用法见附录1data关键字参数,传入一个具有索引功能的对象,此时 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.8bottom设置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 可以取反

python Matplotlib库基础
python Matplotlib库基础
python Matplotlib库基础
python Matplotlib库基础
python Matplotlib库基础
python Matplotlib库基础

举例如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

N = 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()

python Matplotlib库基础

绘制箱型图

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

绘制分类图背景

这个可以在画样本分类图时,同时表现出分类范围。或者在其他需要设置图的背景颜色(例如画地形图时)使用。主要需要用到 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,默认 Truetitle传入字符串或字符串列表,设置图形标题或各个子图标题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 plt

plot_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()

python Matplotlib库基础

面积图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plot_df = pd.DataFrame(
    np.random.randint(1,10,30).reshape(10,3),
    columns = list('ABC')
)
plot_df.plot(kind='area',rot=0)
plt.show()

面积图也可以堆叠

python Matplotlib库基础

六边形分箱图

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

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plot_df2 = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])

plot_df2.plot.hexbin(x='a',y='b',gridsize=25)
plt.show()

python Matplotlib库基础

附录

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 '<'< code><p class="node-read-div2p">triangle_left marker</p><code>'>'</code><p class="node-read-div2p">triangle_right marker</p><code>'1'</code><p class="node-read-div2p">tri_down marker</p><code>'2'</code><p class="node-read-div2p">tri_up marker</p><code>'3'</code><p class="node-read-div2p">tri_left marker</p><code>'4'</code><p class="node-read-div2p">tri_right marker</p><code>'s'</code><p class="node-read-div2p">square marker</p><code>'p'</code><p class="node-read-div2p">pentagon marker</p><code>'*'</code><p class="node-read-div2p">star marker</p><code>'h'</code><p class="node-read-div2p">hexagon1 marker</p><code>'H'</code><p class="node-read-div2p">hexagon2 marker</p><code>'+'</code><p class="node-read-div2p">plus marker</p><code>'x'</code><p class="node-read-div2p">x marker</p><code>'D'</code><p class="node-read-div2p">diamond marker</p><code>'d'</code><p class="node-read-div2p">thin_diamond marker&#x7AD6;&#x7EBF;vline marker</p><code>'_'</code><p class="node-read-div2p">hline marker&#x7EBF;&#x578B;&#xFF08;&#x53EF;&#x7528; linestyle &#x53C2;&#x6570;&#x4EE3;&#x66FF;&#xFF09;&#xFF1A;&#x5B57;&#x7B26;&#x4E32;&#x542B;&#x4E49;----------</p><code>'-'</code><p class="node-read-div2p">solid line style &#x5B9E;&#x7EBF;</p><code>'--'</code><p class="node-read-div2p">dashed line style &#x865A;&#x7EBF;</p><code>'-.'</code><p class="node-read-div2p">dash-dot line style &#x70B9;&#x753B;&#x7EBF;</p><code>':'</code><p class="node-read-div2p">dotted line style &#x70B9;</p><p>&#x4F8B;&#x5982; &#x2018;ro-&#x2019; &#x5C31;&#x4EE3;&#x8868;&#x7EA2;&#x8272;&#xFF0C;&#x6570;&#x503C;&#x70B9;&#x7528;&#x5706;&#x5F62;&#x7A81;&#x51FA;&#xFF0C;&#x70B9;&#x4E4B;&#x95F4;&#x8FDE;&#x7EBF;&#x4E3A;&#x5B9E;&#x7EBF;&#x7684;&#x7EBF;&#x6761;&#x3002;</p><!--'<-->

Original: https://blog.csdn.net/qq_46841701/article/details/113808389
Author: 波啵菠波
Title: python Matplotlib库基础

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/767404/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球