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传入一个浮点数,表示饼图的半径,默认为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 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()

运行结果

绘制箱型图

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

运行结果

面积图
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()

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

六边形分箱图

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

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'])
# 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-’ 就代表红色,数值点用圆形突出,点之间连线为实线的线条。

  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
matplotlib的cmap是指用于设置颜色映射的参数。在Matplotlib中,我们可以使用不同的颜色映射来创建热图。引用中的代码示例中,使用了`cmap=plt.cm.get_cmap('Set1', class_num)`来设置颜色映射。其中,'Set1'是使用的颜色映射名称,class_num是指定颜色映射的数量。 在Matplotlib中,有许多预定义的颜色映射可供选择,例如'jet'、'cool'、'hot'等。此外,您还可以根据自己的需求自定义颜色映射。引用中提到了一篇关于使用并自定义colormap的方法的文章,可以作为自定义颜色映射的参考。 如果您想了解更多关于Matplotlib的cmap参数的信息,可以查阅Matplotlib的官方文档或参考相关的教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [matplotlib的cmap](https://blog.csdn.net/qq_49215659/article/details/116608366)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Python matplotlib的使用并自定义colormap的方法](https://download.csdn.net/download/weixin_38733787/12865617)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值