数据可视化:Matplotlib简单图表绘制大全
面积图亦称堆积折线图,是将折线图中折线与X轴之间的区域用颜色或纹理填充(填充区域的大小称为“面积”),填充后的关注焦点会聚焦于色块上。面积图上总的面积代表了所有数据的总和,各个层的面积表示各数据分量的和,这些堆叠起来的面积图在观察大数据的各个分量变化情况时格外有用。合理分段是构建直方图的关键,每个区间段应是相邻的,并且通常是等距的。plt.bar 函数还可绘制簇状柱形图(也称为分组柱状图),绘制的
(1)折线图
折线图(Line Chart,亦称曲线图)是将数据点用直线连接而成的图形。折线图可用于展示连续型数据变量间的关系,直观体现目标变量y随自变量x的变化趋势,从而发现数据之间的关联性。折线图的X轴通常是数量或时间,Y轴是数值,其基本框架如下图所示。
plt.plot()绘制折线图,格式为:
plt.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
主要参数说明:
- 位置参数 *args:这是用于指定绘制折线图的数据,可以有多种组合形式:单个数组、两个数组、多个数组。
- color 或 c:指定线条的颜色,可以使用颜色名称(如 ‘red’、‘blue’)、十六进制颜色码(如 ‘#FF0000’)等。
- linestyle 或 ls:指定线条的样式,常见取值有 ‘-’(实线,默认值)、‘–’(虚线)、‘-.’(点划线)、‘:’(点线)等。
- linewidth 或 lw:指定线条的宽度,是一个浮点数。
- marker:指定数据点的标记样式,如 ‘o’(圆形)、‘s’(正方形)、‘^’(三角形)等。
基本示例:
(1)如果只传入一个数组,plt.plot() 会将数组的索引作为 x 轴数据,数组的值作为 y 轴数据。
import matplotlib.pyplot as plt
y = [1, 3, 2, 5, 4]
plt.plot(y)
plt.show()
(2)传入两个数组时,第一个数组代表 x 轴数据,第二个数组代表 y 轴数据,要求两个数组长度相同。
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y)
plt.show()
(3)可以一次性传入多组 x、y 数据,用于在同一图中绘制多条折线。
import matplotlib.pyplot as plt
x1 = [1, 2, 3, 4, 5]
y1 = [1, 3, 2, 5, 4]
x2 = [1, 2, 3, 4, 5]
y2 = [2, 4, 3, 6, 5]
plt.plot(x1, y1, x2, y2)
plt.show()
修改线条颜色(c或color参数)
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y,color='r') #将线条颜色更改为红色
plt.show()
修改散点类型(marker参数)
marker参数取值说明:
标记字符 | 说明 |
---|---|
. | 点标记,小实心点 |
, | 像素标记,极小的像素点 |
o | 实心圆圈标记 |
v | 下三角标记 |
^ | 上三角标记 |
< | 左三角标记 |
> | 右三角标记 |
1 | 下花形标记 |
2 | 上花形标记 |
3 | 左花形标记 |
4 | 右花形标记 |
s | 正方形标记 |
p | 五边形标记 |
* | 星号标记 |
h | 竖六边形 |
H | 横六边形 |
+ | 十字 |
x | X |
D | 菱形 |
d | 瘦菱形 |
丨 | 垂直线 |
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y,marker='o') #o表示把散点类型改为实心圆
plt.show()
修改线条样式(ls或 linestyle参数)
ls参数说明:
风格字符 | 说明 | 风格字符 | 说明 |
---|---|---|---|
- | 实线,默认值 | – | 虚线 |
-. | 点划线 | : | 点线 |
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y,ls=':') #将线条样式更改为点线
plt.show()
(2)阶梯图
阶梯图是折线图的y值持续保持在同一个值,直到发生变化跳跃到下一个值,其形状类似阶梯。
plt.step()绘制散点图,格式为:
plt.step(x, y, where='pre', **kwargs)
- x,y: 对应数据的x和y值,格式为一维数据或列表。
- where:该参数决定了阶梯的绘制方式,即阶梯的转折点位置,有以下三种取值:‘pre’:默认值,表示阶梯在每个 x 值处向前跳跃,也就是说,阶梯的水平线段从当前 x 值开始,到下一个 x 值结束。 ‘post’:阶梯在每个 x 值处向后跳跃,即阶梯的水平线段从当前 x 值的前一个位置开始,到当前 x 值结束。‘mid’:阶梯在相邻两个 x 值的中点处跳跃,水平线段的端点位于相邻两个 x 值的中间位置。
where参数三种取值对比:
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 2, 3, 4])
y = np.array([1, 3, 2, 4])
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plt.step(x, y, where='pre',marker='*')#表示阶梯在每个 x 值处向前跳跃
plt.title("where='pre'")
plt.subplot(1, 3, 2)
plt.step(x, y, where='post',marker='*')#阶梯在每个 x 值处向后跳跃
plt.title("where='post'")
plt.subplot(1, 3, 3)
plt.step(x, y, where='mid',marker='*')#阶梯在相邻两个 x 值的中点处跳跃
plt.title("where='mid'")
plt.show()
(3)面积图
面积图亦称堆积折线图,是将折线图中折线与X轴之间的区域用颜色或纹理填充(填充区域的大小称为“面积”),填充后的关注焦点会聚焦于色块上。面积图一般是多组时序数据的叠加,强调数量随着时间而变化,引导人们关注总值的变化趋势。面积图上总的面积代表了所有数据的总和,各个层的面积表示各数据分量的和,这些堆叠起来的面积图在观察大数据的各个分量变化情况时格外有用。
plt.stackplot()绘制面积图,格式为:
plt.stackplot(x, *args, labels=(), colors=None, baseline='zero', data=None, **kwargs)
- x:表示 x 轴的数据,通常是一系列的数值,用于确定每个数据点在 x 轴上的位置。
- colors:数组或列表,可选参数,默认值为 None,用于指定每个数据系列的填充颜色。
- labels:元组或列表,可选参数,默认值为 (),用于为每个数据系列设置标签,这些标签会显示在图例中。
使用示例:
x = np.arange(1, 6)
y1 = [20, 36, 40, 22, 20]
y2 = [60, 85, 70, 65, 62]
y3 = [40, 55, 60, 45, 30]
labels = ['A', 'B', 'C']
# 自定义颜色,颜色由十六进制RGB构成
colors = ['#ac8e00', '#fc8d99', '#abcd05']
plt.stackplot(x, y1, y2, y3, labels=labels, colors=colors) #面积图
plt.legend(fontsize=14)
plt.title('面积图', fontsize=18)
(4)散点图
散点图,顾名思义就是由一些散乱的点构成的图形。散点图使用一系列的散点在平面直角坐标系中展示(x,y)变量的分布情况。在统计学的回归分析与预测中会频繁使用散点图。
plt.scatter()绘制散点图,格式为:
plt.scatter(x,y,s=None,c=None,marker=None,cmap=None,edgecolors=None, **kwargs
- x,y: 对应数据的x和y值,格式为一维数据或列表。
- s:用于设置散点的大小。可以是单个数值,表示所有散点具有相同的大小;也可以是一个与 x、y 长度相同的数组或列表,为每个散点指定不同的大小。默认值为 None,此时会使用一个默认的大小。
- c:用于设置散点的颜色。可以是单个颜色值,表示所有散点具有相同的颜色marker:指定散点的标记样式数值数组,结合 cmap 参数使用,根据数值的大小映射到颜色映射表中的不同颜色。
- cmap:当 c 是一个数值数组时,cmap 用于指定颜色映射表,将数值映射到不同的颜色。常见的颜色映射表有 ‘viridis’、‘plasma’、‘inferno’ 等。
- marker:
基本用法示例:
import matplotlib.pyplot as plt
temperatures = [20, 22, 25, 28, 30, 32, 35]
ice_cream_sales = [100, 120, 150, 200, 230, 260, 300]
# 绘制散点图
plt.scatter(temperatures, ice_cream_sales, color='orange', marker='o')
plt.show()
(5)柱状图
柱状图是以柱体高度或者长度的差异来反映数值变化的一种统计图表。柱状图的水平x轴可以是类别型、序数型或数值型,数值y轴映射柱体的高度。
plt.bar()用于绘制柱状图,格式为:
plt.bar(x, height, width=0.8, bottom=None, align='center', data=None, **kwargs)
主要参数说明:
- x:表示柱状图中柱子的横坐标位置,用于确定每个柱子在水平轴上的位置。
- height:表示柱子的高度,即柱子所代表的数据值。height 的长度必须与 x 的长度相同,每个 height 值对应一个 x 位置上的柱子高度。
- width:表示柱子的宽度。如果传入一个浮点数,则所有柱子的宽度相同;如果传入一个数组,则数组中的每个元素对应一个柱子的宽度。默认值为 0.8。
- bottom:表示柱子底部的起始位置。如果指定了 bottom,则柱子将从 bottom 的值开始向上绘制。
- align:表示柱子与 x 坐标的对齐方式,有两个可选值:‘center’:柱子将以 x 坐标为中心对齐。
‘edge’:柱子将以 x 坐标为左边缘对齐。 - color:柱体颜色。
- edgecolor:边框颜色。
- tick_label:柱体下面的标签。
基本示例:
import matplotlib.pyplot as plt
# 定义不同城市名称
cities = ['北京', '上海', '广州', '成都', '哈尔滨']
# 定义对应城市的年平均气温(单位:摄氏度)
average_temperatures = [12, 17, 22, 16, 4]
plt.bar(cities,average_temperatures)
簇状柱形图
plt.bar 函数还可绘制簇状柱形图(也称为分组柱状图),绘制的原理是通过控制每组柱子在 x 轴上的位置,让不同组的柱子紧挨着排列,从而实现分组展示数据的效果。
- 代码示例:
import matplotlib.pyplot as plt
import numpy as np
# 不同班级
classes = ['Class A', 'Class B', 'Class C']
# 不同科目
subjects = ['Math', 'Physics', 'Chemistry']
# 各科成绩数据
math_scores = [85, 90, 78]
physics_scores = [88, 92, 80]
chemistry_scores = [92, 87, 85]
# 合并成绩数据
scores = [math_scores, physics_scores, chemistry_scores]
# 设置柱子的宽度
bar_width = 0.2
# 生成 x 轴位置
r1 = np.arange(len(classes))
r2 = [x + bar_width for x in r1]
r3 = [x + bar_width for x in r2]
# 绘制簇状柱形图
plt.bar(r1, math_scores, width=bar_width, label='Math')
plt.bar(r2, physics_scores, width=bar_width, label='Physics')
plt.bar(r3, chemistry_scores, width=bar_width, label='Chemistry')
# 设置 x 轴标签和刻度
plt.xticks([r + bar_width for r in range(len(classes))], classes)
# 显示图例
plt.legend()
# 显示图形
plt.show()
堆积柱状图(bottom 参数)
- 堆积柱状图是将同一类别的若干柱体上下堆积而成的。堆叠后即可对比单个数据,又可对比每个类别的总和数据。
- bar 函数绘制堆积柱状图是通过控制每个柱子的起始位置(即 bottom 参数),让后续的柱子依次堆叠在前一个柱子之上,从而直观地展示各部分数据在整体中的占比关系。
plt.figure(figsize=(12, 6), dpi=100)
np.random.seed(7)
sno = np.arange(1, 11)
y = np.random.randint(55, 100, size=(10, 3)) # 产生10行3列的数组,对应三科成绩
plt.bar(sno, y[:, 0], width=0.6, label='语文', tick_label=sno)
plt.bar(sno, y[:, 1], width=0.6, bottom=y[:, 0], label='数学')
plt.bar(sno, y[:, 2], width=0.6, bottom=y[:, 0] + y[:, 1], label='英语')
plt.legend(fontsize=14, bbox_to_anchor=(1, 1))
plt.title('十位学生三科成绩对比图', fontsize=18)
(6)饼图
饼图适合表现比例、份额类的数据,清晰地呈现了各子类的占比情况。但是饼图不适合做数据的精确对比,因为对人眼来说,占比20%和25%的扇形区分度并不大。分类过多的数据也不适合使用饼图,因此绘制饼图的时候,类别应控制在10个以内。
plt.pie()用于绘制饼图,格式为:
plt.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)
主要参数说明:
- x:是一个必需的参数,它是一个数组(如列表、NumPy 数组等),数组中的每个元素代表饼图中一个扇形的数值。这些数值会被自动归一化,以计算每个扇形在整个饼图中所占的百分比。
- explode:可选参数,是一个与 x 长度相同的数组。数组中的每个元素表示对应扇形是否要从饼图中心分离出来,值为 0 表示不分离,大于 0 的值表示分离的程度。
- labels:可选参数,是一个与 x 长度相同的数组,用于为每个扇形添加标签。
- colors:可选参数,是一个数组,用于指定每个扇形的颜色。颜色可以用常见的颜色名称(如 ‘red’、‘blue’)、十六进制颜色码(如 ‘#FF0000’)等表示。
- autopct:可选参数,用于指定每个扇形上显示的百分比格式。它可以是一个字符串格式,例如 ‘%1.1f%%’ 表示保留一位小数的百分比。
- wedgeprops:可选参数,是一个字典,用于指定每个扇形的属性,如边框颜色、线宽等。
基本饼图示例:
import matplotlib.pyplot as plt
# 定义不同水果的销售数量
fruits = ['苹果', '香蕉', '橙子', '葡萄']
sales = [30, 25, 20, 15]
plt.pie(sales,labels = fruits)
显示百分比(autopct参数)
import matplotlib.pyplot as plt
# 定义不同水果的销售数量
fruits = ['苹果', '香蕉', '橙子', '葡萄']
sales = [30, 25, 20, 15]
plt.pie(sales,labels = fruits,autopct='%1.1f%%')
修改颜色(colors参数)
import matplotlib.pyplot as plt
# 定义不同水果的销售数量
fruits = ['苹果', '香蕉', '橙子', '葡萄']
sales = [30, 25, 20, 15]
color = ['g','b','y','r']
plt.pie(sales,labels = fruits,autopct = '%1.1f%%',colors = color)
重点突出某个扇形(explode参数)
饼图每个扇形的尖端和圆心是重合的,如果想重点突出某一个扇形,可设置参数explode来实现。例如设置explode=(0, 0.2, 0, 0)将第2个扇形突出了0.2的位置。
import matplotlib.pyplot as plt
# 定义不同水果的销售数量
fruits = ['苹果', '香蕉', '橙子', '葡萄']
sales = [30, 25, 20, 15]
explode=(0, 0.2, 0, 0)
plt.pie(sales,labels = fruits,autopct = '%1.1f%%',explode = explode)
环形图(wedgeprops参数)
环形图看起来像一个面包圈,外围不同颜色的弧形长度反映数值的差异,而饼图则是通过扇形角度反映类别的占比。饼图强调整体性,一般只绘制单个饼图,只反映按一个指标分类的占比。而环形图可以叠加,同时反映多种分类情况的对比。
import matplotlib.pyplot as plt
# 定义不同水果的销售数量
fruits = ['苹果', '香蕉', '橙子', '葡萄']
sales = [30, 25, 20, 15]
explode=(0, 0.2, 0, 0)
#wedgeprops参数设置环的宽度为0.6
plt.pie(sales,labels = fruits,autopct = '%1.1f%%',wedgeprops=dict(width=0.6))
(7)直方图
直方图(Histogram,亦称质量分布图)是一种统计图表,由一系列高度不等的柱体表示数据的分布情况,基本框架如图所示。一般横轴表示数据区间段,纵轴表示柱体对应区间段所含的数据频次。构建直方图时需将数据合理分段,统计每个数据段内含有数据的个数,数据频次即柱体的高度。合理分段是构建直方图的关键,每个区间段应是相邻的,并且通常是等距的。
plt.hist()用于绘制直方图,格式为:
plt.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, *, data=None, **kwargs)
主要参数说明:
- x:必需参数,是输入的数据,可以是单个数组,也可以是多个数组组成的序列(如列表)。如果是多个数组,会为每个数组绘制不同颜色的直方图。
- bins:可选参数,用于指定直方图的区间数量,也可以是一个数组,指定每个区间的边界。默认值会根据数据自动确定合适的区间数量。
- density:可选参数,是一个布尔值。如果为 True,则绘制的是概率密度直方图,即直方图的面积总和为 1;如果为 False,则绘制的是频数直方图,显示每个区间内数据的数量。
- cumulative:可选参数,是一个布尔值。如果为 True,则绘制累积直方图,即每个区间的频数或密度是该区间及其之前所有区间的总和。
- histtype:可选参数,用于指定直方图的类型,有以下几种取值:
‘bar’:默认值,绘制传统的柱状直方图。
‘barstacked’:绘制堆叠的柱状直方图,适用于多个数据集的情况。
‘step’:绘制阶梯状的直方图,只显示轮廓。
‘stepfilled’:绘制填充的阶梯状直方图。 - edgecolor/facecolor:柱体边缘颜色和柱体颜色。
基本直方图示例:
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randn(1000)
plt.hist(x)
plt.show()
指定直方图的区间数量(bin参数)
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randn(1000)
plt.hist(x, bins=20) # 指定 20 个区间
plt.show()
修改柱体边缘颜色和柱体颜色(edgecolor/facecolor参数)
将柱体边缘颜色改为黑色,柱体颜色改为黄色。
import matplotlib.pyplot as plt
import numpy as np
x = np.random.randn(1000)
plt.hist(x, bins=20, histtype='bar',edgecolor='black', facecolor='y')
plt.show()
堆积直方图(stacked参数)
如果想在同一画布中绘制两个班的成绩分布情况,可用堆积直方图来实现,绘制时提供两组数据,指定“stacked=True”的关键字参数。同时bins参数没有设置为单个数值,而是设定为一个数值列表,这样可以自定义分段区域,数据边界按左闭右开的原则。
np.random.seed(7)
scores1 = np.random.randint(30, 101, 50) # 1班分数
scores2 = np.random.randint(30, 101, 50) # 2班
x = [scores1, scores2]
bins = [0, 40, 60, 80, 90, 100] # 自定义分数段,统计指定区间段的人次
# stacked=True 表示堆积
plt.hist(x, bins=bins, color=['b', 'm'], edgecolor='k', stacked=True, label=['1', '2'], alpha=0.5)
plt.ylabel('人次', fontsize=16)
plt.title('两个班成绩分布(堆积直方图)', fontsize=18)
更多推荐
所有评论(0)