快速使用Matplotlib画出各类图表

Python库Matplotlib入门

Matplotlib是一个用于在Python中创建静态、动画和交互式可视化的综合库。Matplotlib让容易的事情变得更容易,让困难的事情成为可能。


安装

直接用pip命令安装

pip install matplotlib

PyCharm内安装

主菜单-设置-项目-Python解释器-+
在这里插入图片描述

搜索matplotlib-点击-安装软件包
在这里插入图片描述

官网下载安装包

Matplotlib 3.8.2 Release


导入软件包

# 导入pyplot
import matplotlib.pyplot as plt
# 导入numpy
import numpy as np

import matplotlib as mpl

基本使用

组成

以下图片展示了MatplotLib的组成部分
在这里插入图片描述

首先最大的部分为 图形(Figure) ,包含了界面的所有内容: 坐标系(Axes)子图形(SubFigure) 、标签、曲线等等。

使用plt.figure()可以快速创建一个图形。

坐标系(Axes) 是包含在图形内用于绘制坐标数据的地方,通常包含两个或三个(二维或三位) 坐标轴(Axis) 。可以用ax.plot()来快速绘制坐标数据。

坐标轴(Axis) 类似于数学上的坐标轴,可以设置刻度和长度,对应的刻度上有标记(数值等)。

图元(Artist) 基本上所有的可见图形都是图元(甚至图形、坐标系、坐标轴都是),当 图形(Figure) 被渲染的时候,所有的图元都将显示在 画布(canvas) 上。

代码练习

快速创建基本坐标系
# 使用 plt.subplots() 可以快速创建一个带坐标系的图形
# fig代表Figure(图形)
# ax代表Axes(坐标系)
fig, ax = plt.subplots()
# 调用坐标系绘制数据
# 坐标(x,y)分别为 (1,1) (2,3) (3,2)
ax.plot([1, 2, 3], [1, 3, 2])
# 展现图形
plt.show()
# 保存图形
plt.savefig("test.png")
坐标系拓展

创建一个空的图形fig = plt.figure()

创建带2x2网格的坐标系fig, axs = plt.subplots(2,2)

创建左边有一个轴,右边有两个轴的图形fig, axs = plt.subplot_mosaic([["left", "right_top"], ["left", "right_bottom"]])


实现可视化图表

可视化分布

散点图&气泡图

使用plt.scatter()方法即可画出散点图,散点图可以直观表现出影响因素和预测对象之间的总体关系趋势。

matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)

参数说明:

x,y:长度相同的数组,也就是我们即将绘制散点图的数据点,输入数据。

s:点的大小,默认 20,也可以是个数组,数组每个参数为对应点的大小。

c:点的颜色,默认蓝色 ‘b’,也可以是个 RGB 或 RGBA 二维行数组。

marker:点的样式,默认小圆圈 ‘o’。

cmap:Colormap,默认 None,标量或者是一个 colormap 的名字,只有 c 是一个浮点数数组的时才使用。如果没有申明就是 image.cmap。

norm:Normalize,默认 None,数据亮度在 0-1 之间,只有 c 是一个浮点数的数组的时才使用。

vmin,vmax::亮度设置,在 norm 参数存在时会忽略。

alpha::透明度设置,0-1 之间,默认 None,即不透明。

linewidths::标记点的长度。

edgecolors::颜色或颜色序列,默认为 ‘face’,可选值有 ‘face’, ‘none’, None。

plotnonfinite::布尔值,设置是否使用非限定的 c ( inf, -inf 或 nan) 绘制点。

示例如下:

# 快速创建一块图形和一个二维坐标系
fig, ax = plt.subplots()
# 设置x轴为0~3π,共有30个点
x = np.linspace(0, 3 * np.pi, 30)
# y轴为sin(x)
y = np.sin(x)
# 随机设置这30个点的大小
# 即得到长度为30的随机数一维数组
s = np.random.randint(0, 60, size=(30))
# 所有点的颜色为红色
c = "red"
# 在坐标系中绘制
ax.scatter(x, y, s, c)
# 显示画布
plt.show()

在这里插入图片描述

c = "red"改成c = np.random.randint(0, 100, size=(30))还能获得一个随机颜色分布的图像:

在这里插入图片描述

np.random.randint(0, 100, size=(30))可以获得长度为30的随机一维数组,数值在0~100之间,上面那副图得到的数组就为[11 11 4 37 17 41 51 12 59 58 5 62 58 91 65 92 32 76 25 51 58 46 16 4 73 28 49 40 28 44]。而matplotlib提供了各种各样的颜色条,其中0~100的数代表不同的颜色。

直方图

使用plt.hist()方法可以画出直方图,直方图便于观察数据的中心趋势、偏态和异常值等。

matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs)

参数说明:

x:表示要绘制直方图的数据,可以是一个一维数组或列表。
bins:可选参数,表示直方图的箱数。默认为10。
range:可选参数,表示直方图的值域范围,可以是一个二元组或列表。默认为None,即使用数据中的最小值和最大值。
density:可选参数,表示是否将直方图归一化。默认为False,即直方图的高度为每个箱子内的样本数,而不是频率或概率密度。
weights:可选参数,表示每个数据点的权重。默认为None。
cumulative:可选参数,表示是否绘制累积分布图。默认为False。
bottom:可选参数,表示直方图的起始高度。默认为None。
histtype:可选参数,表示直方图的类型,可以是’bar’、‘barstacked’、‘step’、‘stepfilled’等。默认为’bar’。
align:可选参数,表示直方图箱子的对齐方式,可以是’left’、‘mid’、‘right’。默认为’mid’。
orientation:可选参数,表示直方图的方向,可以是’vertical’、‘horizontal’。默认为’vertical’。
rwidth:可选参数,表示每个箱子的宽度。默认为None。
log:可选参数,表示是否在y轴上使用对数刻度。默认为False。
color:可选参数,表示直方图的颜色。
label:可选参数,表示直方图的标签。
stacked:可选参数,表示是否堆叠不同的直方图。默认为False。
**kwargs:可选参数,表示其他绘图参数。

代码示例:

实现单个数据的直方图:

# 快速创建一块图形和一个二维坐标系
fig, ax = plt.subplots()
# 生成正态分布的一维数组 有1000个元素
data = np.random.randn(1000)
# 以data为数据生成一个直方图
# bins为直方图的条数 分为50条
# color为天蓝色
# alpha为颜色的透明度 80%
ax.hist(data, bins=50, color="skyblue", alpha=0.8)
# 显示画布
plt.show()

在这里插入图片描述

如果有多个数据要对照,可以采用以下方法:

fig, ax = plt.subplots()
# 生成正态分布的两个不同的一维数组
data1 = np.random.randn(1000)
data2 = np.random.randn(1000)
# 一个为天蓝色的 label标签为 Data 1
ax.hist(data1, bins=50, label="Data 1", color="skyblue", alpha=0.5)
# 一个为粉色的 label标签为 Data 2
ax.hist(data2, bins=50, label="Data 2", color="pink", alpha=0.5)
# 展示数据的标签 即刚才设置的label
plt.legend()
plt.show()

在这里插入图片描述

概率密度图

概率密度图可以用来显示数据的密度分布。

画概率密度图需要seaborn,使用pip install seaborn来安装。用该软件包下的seaborn.distplot()可实现概率密度分布图。

seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)

参数说明:

a:1维数组或者列表。

bins:显示直方图的条数

hist:布尔值,是否绘制直方图

kde:布尔值,是否绘制密度曲线

rug:布尔值,是否在横轴上绘制观测值的竖线

fit:一个带有fit方法的对象,返回一个元组。

hist_kws:底层绘图函数的关键字参数。

kde_kws:底层绘图函数的关键字参数。

rug_kws:底层绘图函数的关键字参数。

color:曲线外所有内容的颜色

vertical:布尔值,观测值是否在y轴显示

label:图形的标签

如下为示例:

# 创建一个正态分布的一维数组 有10000个数据点
data = np.random.randn(10000)
# 画出这个数据的密度曲线 不画出直方图
# 把hist改成True即可显示直方图
sns.distplot(data, hist=False, kde=True)
# 显示画布
plt.show()

在这里插入图片描述

箱型图

箱型图是一种用作显示一组数据分散情况资料的统计图。因图形如箱子,且在上下四分位数之外常有线条像胡须延伸出去而得名。

箱型图的形态如下所示:

Q1-1.5IQR   Q1   Q2    Q3   Q3+1.5IQR
            |-----:-----|
   |--------|     :     |--------|
            |-----:-----|
            <----------->
                 IQR

Q2:所有数据的中位数
Q1:下四分位数(低于中位数的所有数据的中位数)
Q3:上四分位数(高于中位数的所有数据的中位数)
IQR:上下四分位数的距离
Q1-1.5IQR:所有数据的下限
Q3+1.5IQR:所有数据的上限

使用plt.boxplot()方法可以绘制箱型图。

matplotlib.pyplot.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:是否是凹口的形式展现箱线图

sym:指定异常点的形状

vert:是否需要将箱线图垂直摆放

whis:指定上下须与上下四分位的距离

positions:指定箱线图的位置

widths:指定箱线图的宽度

patch_artist:是否填充箱体的颜色

meanline:是否用线的形式表示均值

showmeans:是否显示均值

showcaps:是否显示箱线图顶端和末端的两条线

showbox:是否显示箱线图的箱体

showfliers:是否显示异常值

boxprops:设置箱体的属性,如边框色,填充色等

labels:为箱线图添加标签,类似于图例的作用

filerprops:设置异常值的属性,如异常点的形状、大小、填充色等

medianprops:设置中位数的属性,如线的类型、粗细等

meanprops:设置均值的属性,如点的大小、颜色等

capprops:设置箱线图顶端和末端线条的属性,如颜色、粗细等

whiskerprops:设置须的属性,如颜色、粗细、线的类型等

代码示例:

fig, ax = plt.subplots()
# 以正态分布生存3组数据
data1 = np.random.randn(1000)
# 第二组数据开平方
data2 = np.random.randn(1000) ** 2
# 第三组数据开立方
data3 = np.random.randn(1000) ** 3
# 绘制3个数据的箱型图 不显示异常值
ax.boxplot([data1, data2, data3], showfliers=False)
# 显示画布
plt.show()

在这里插入图片描述

色块图&热力图

热力图是指用 X 轴和 Y 轴 表示的两个分类字段确定数值点的位置,通过相应位置的矩形颜色去表现数值的大小,颜色深代表的数值大。

在matplotlib中,使用plt.imshow()方法可以快速绘制出热力图(或者图片)。

imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, *, data=None, **kwargs)

参数说明:

X:输入数据。可以是二维数组、三维数组、PIL图像对象、matplotlib路径对象等。
cmap:颜色映射。用于控制图像中不同数值所对应的颜色。可以选择内置的颜色映射,如gray、hot、jet等,也可以自定义颜色映射。
norm:用于控制数值的归一化方式。可以选择Normalize、LogNorm等归一化方法。
aspect:控制图像纵横比(aspect ratio)。可以设置为auto或一个数字。
interpolation:插值方法。用于控制图像的平滑程度和细节程度。可以选择nearest、bilinear、bicubic等插值方法。
alpha:图像透明度。取值范围为0~1。
origin:坐标轴原点的位置。可以设置为upper或lower。
extent:控制显示的数据范围。可以设置为[xmin, xmax, ymin, ymax]。
vmin、vmax:控制颜色映射的值域范围。
filternorm 和 filterrad:用于图像滤波的对象。可以设置为None、antigrain、freetype等。
imlim: 用于指定图像显示范围。
resample:用于指定图像重采样方式。
url:用于指定图像链接。

代码示例:

# 随机生成数据
data = np.random.randn(16, 16)
# 将数据展示为热力图 使用hot的色彩空间
plt.imshow(data, cmap="hot")
# 显示颜色对应的数值
plt.colorbar()
# 显示画布
plt.show()

在这里插入图片描述

可视化对比

柱状图&条形图

柱形图,柱形图又称条形图、直方图,是以宽度相等的条形高度或长度的差异来显示统计指标数值多少或大小的一种图形。

可以使用plt.bar()或者plt.barh()来绘制柱形图。

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

参数说明:

x:浮点型数组,柱形图的 x 轴数据。

height:浮点型数组,柱形图的高度。

width:浮点型数组,柱形图的宽度。

bottom:浮点型数组,底座的 y 坐标,默认 0。

align:柱形图与 x 坐标的对齐方式,‘center’ 以 x 位置为中心,这是默认值。 ‘edge’:将柱形图的左边缘与 x 位置对齐。要对齐右边缘的条形,可以传递负数的宽度值及 align=‘edge’。

**kwargs::其他参数。

代码示例:

# x轴的标签 是一个一维数组
x_lable = np.array(["January", "February", "March", "April"])
# x轴标签所对应的数值
height = np.array([5.0, 2.0, 3.0, 2.8])
# 画柱形图
plt.bar(x_lable, height)
# 显示图形
plt.show()

在这里插入图片描述

除此之外,把plt.bar()替换成plt.barh()可以画水平的柱状图:

在这里插入图片描述

雷达图

雷达图是以从同一点开始的轴上表示的三个或更多个定量变量的二维图表的形式显示多变量数据的图形方法。

plt.polar()方法可以绘制出雷达图。

matplotlib.pyplot.polar(**args*, ***kwargs*)

参数说明:

theta:每个标记所在射线与极径的夹角
r:每个标记到原点的距离
marker:标记点样式
markersize(ms):标记点的大小
markerfacecolor(mfc):标记点的填充颜色
markeredgecolor(mec):标记点的边界颜色
color:线条颜色
linestyle(ls):ls=‘None’: 线条不显示
linewidth(lw):线条粗细

代码示例:

# 把雷达图分成6块 即有6个数据
bars = 6
bars += 1
# 转过的角度 从0~2π分成7块 最后一个和第一个重合
theta = np.linspace(0.0, 2 * np.pi, bars)
# 每个角度对应的数据值 最后一个和第一个数据要相同才能闭合
r = np.array([1, 2, 3, 4, 5, 6, 1])
# 绘制雷达图
plt.polar(theta, r)
# 显示图形
plt.show()

在这里插入图片描述

折线图

折线图是排列在工作表的列或行中的数据可以绘制到折线图中。折线图可以显示随时间(根据常用比例设置)而变化的连续数据,因此非常适用于显示在相等时间间隔下数据的趋势。

使用plt.plot()可以很方便的绘制折线图的所有点。

参数说明:

x:要绘制折线图的x轴数据。
y:要绘制折线图的y轴数据。
c(可选):指定折线的颜色。默认为蓝色(“b”)。
marker(可选):指定折线上的标记符号。默认为无标记(无标记线)。
markersize(可选):指定标记符号的大小。默认为6。

代码示例:

# 快速创建一个二维坐标系
fig, ax = plt.subplots()
# x和y的数据
x = [1, 2, 3]
y = [1, 3, 2]
# 绘制折线图的点
ax.plot(x, y)
# 显示图形
plt.show()

在这里插入图片描述

面积图

面积图强调数量随时间而变化的程度,也可用于引起人们对总值趋势的注意。

plt.stackplot()可以绘制面积图,它的使用方法跟plt.plot()类似。

代码示例:

# 快速创建一个二维坐标系
fig, ax = plt.subplots()
# x和y的数据
x = [1, 2, 3]
# y有两个堆叠的数据
y = [[1, 3, 2], [2, 1, 1]]
# 绘制折线图的点
# 颜色分别为粉色和天蓝色 透明度为0.5
ax.stackplot(x, y, colors=["pink", "skyblue"], alpha=0.5)
# 显示图形
plt.show()

在这里插入图片描述

展示联系

桑基图
和弦图
旭日图
关系图

展示构成

饼图

饼图是一种圆形图表,通过将圆形划分为不同的扇区来表达数值、比例或者频率的相对关系。

matplotlib提供了plt.pie()方法来绘制饼图。

matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)[source]

参数说明:

x:浮点型数组或列表,用于绘制饼图的数据,表示每个扇形的面积。

explode:数组,表示各个扇形之间的间隔,默认值为0。

labels:列表,各个扇形的标签,默认值为 None。

colors:数组,表示各个扇形的颜色,默认值为 None。

autopct:设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。

labeldistance:标签标记的绘制位置,相对于半径的比例,默认值为 1.1,如 <1则绘制在饼图内侧。

pctdistance::类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。

shadow::布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。

radius::设置饼图的半径,默认为 1。

startangle::用于指定饼图的起始角度,默认为从 x 轴正方向逆时针画起,如设定 =90 则从 y 轴正方向画起。

counterclock:布尔值,用于指定是否逆时针绘制扇形,默认为 True,即逆时针绘制,False 为顺时针。

wedgeprops :字典类型,默认值 None。用于指定扇形的属性,比如边框线颜色、边框线宽度等。例如:wedgeprops={‘linewidth’:5} 设置 wedge 线宽为5。
textprops :字典类型,用于指定文本标签的属性,比如字体大小、字体颜色等,默认值为 None。
center :浮点类型的列表,用于指定饼图的中心位置,默认值:(0,0)。
frame :布尔类型,用于指定是否绘制饼图的边框,默认值:False。如果是 True,绘制带有表的轴框架。
rotatelabels :布尔类型,用于指定是否旋转文本标签,默认为 False。如果为 True,旋转每个 label 到指定的角度。
data:用于指定数据。如果设置了 data 参数,则可以直接使用数据框中的列作为 x、labels 等参数的值,无需再次传递。

代码示例:

# 数据值为一维数组
data = [30, 20, 50]
# 绘制饼图
plt.pie(data)
# 显示图形
plt.show()

在这里插入图片描述

可以优化显示的效果:

# 数据值为一维数组
data = [300, 200, 600]
# 标签
labels = ["A", "B", "C"]
# 标签对应的颜色
colors = ["yellowgreen", "lightskyblue", "lightcoral"]
# 绘制饼图
# shadow表示显示阴影
# autopct表示显示每块的百分比
plt.pie(data, labels=labels, colors=colors, autopct="%1.1f%%", shadow=True)
# 显示图形
plt.show()

在这里插入图片描述

栅格图

栅格图一般指光栅图像。 光栅图也叫做位图、点阵图、像素图,简单的说,就是最小单位由像素构成的图,只有点的信息,缩放时会失真。

栅格图的绘制参考上面热力图的绘制方法。

矢量图

矢量图可以让矢量场可视化,如物理的磁感应线等等。

使用plt.quiver()方法可以绘制出矢量图。

代码示例:

dx = 0.1
dy = 0.1
x, y = np.meshgrid(
    np.arange(-1.05, 1.05 + dx, dx),
    np.arange(-1.05, 1.05 + dy, dy),
    indexing="xy",
    sparse=False,
)
u = x
v = -y
s = np.sqrt(u**2 + v**2)
plt.quiver(x, y, u, v)
plt.show()

在这里插入图片描述


  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值