Matplotlib绘图高级设置
1.坐标轴和刻度
在数据可视化中,一个好的坐标轴和刻度能够清晰界定数据的展示维度与范围,为数据搭建起准确的参照框架,让观众一眼就能明确数据的边界与分布区间;同时,它们能精准量化数据,通过合理的刻度细分,使数据之间的大小、比例及变化幅度等关系一目了然,帮助观众快速进行比较和分析,并且能巧妙引导视觉感知,避免视觉误导,从而让数据所蕴含的信息得以准确、直观地呈现,助力观众更好地理解和解读数据。
1.1轴标签设置
轴标签是轴最重要的属性,说明该轴对应何种数据。其设置命令为plt.xlabel()/plt.ylabel()或ax.set_xlabel()/ax.set_ylabel()。
plt.xlabel()/plt.ylabel()或ax.set_xlabel()/ax.set_ylabel()的功能都是为图表添加 x或y 轴标签,它们的大部分参数是一样的,因此下面以plt.xlabel()进行参数说明:
plt.xlabel()调用格式:
plt.xlabel(xlabel, fontdict=None, labelpad=None, loc=None, **kwargs)
参数说明:
- xlabel:此参数为字符串类型,是必需的。它代表着要显示在 x 轴上的标签文本。
- labelpad:这是一个浮点数类型的参数,默认为None。它表示标签与 x 轴之间的间距,单位通常是磅。
- loc:此参数为字符串类型,默认为None。其取值可以是’left’、‘center’、‘right’,用于指定 x 轴标签的水平对齐位置。
- bbox :此参数为一个字典,用来为 x 轴标签添加一个边框盒子。
- fontproperties:可以设置字体的属性。
此外还可以使用color、fontsize等属性修饰轴标签
使用示例:
- 使用plt.xlabel()/plt.ylabel()设置x、轴标签:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.rcParams['font.family']='SimHei' # 设置使用黑体字体以正常显示中文
plt.rcParams['axes.unicode_minus']=False # 正常显示负号
a = np.arange(0, 5, 0.02)
ax = plt.subplot()
ax.plot(a, np.sin(2*np.pi*a), 'r-.')
box = dict(facecolor='#6959CD', pad=2, alpha=0.4) # 文本框属性,字典格式
# 设置x轴标签,字体为黑体,18以及为x轴标签添加外框盒子
ax.set_xlabel('横轴:时间', fontproperties='SimHei', fontsize=18,bbox=box)
ax.set_ylabel('纵轴:振幅', fontproperties='SimHei', labelpad=5, fontsize=18) # 标签与 x 轴之间的间距为5
- 使用ax.set_xlabel()/ax.set_ylabel()设置x、轴标签:
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0, 5, 0.02)
ax = plt.subplot()
ax.plot(a, np.sin(2*np.pi*a), 'r-.')
ax.set_xlabel('横轴:时间', fontproperties='SimHei', fontsize=18) # 设置x轴标签,字体为黑体,18
ax.set_ylabel('纵轴:振幅', fontproperties='SimHei', labelpad=5, fontsize=18) # 标签与 x 轴之间的间距为5
1.2轴范围设置
绘图时坐标轴显示的数据范围一般会根据绘图数据自动设定,但有时需要做一些调整。图形太靠近边框可增大轴的范围,图形留白太多可缩小轴的范围。设置轴范围使用plt.xlim()/plt.ylim()或ax.set_xlim()/ax.set_ylim()命令。
plt.xlim()/plt.ylim()、ax.set_xlim()/ax.set_ylim()参数大致相同,以下以plt.xlim()参数为例,进行说明:
plt.xlim()语法:
plt.xlim(left, right)
- left:这是一个必需的数值类型参数,代表 x 轴显示范围的最小值。
- right:这也是一个必需的数值类型参数,代表 x 轴显示范围的最大值。
注意事项:
(1)left 和 right 的值可以是任意实数,并且 left 不一定小于 right。若 left 大于 right,x 轴的数值会按降序排列。
(2)plt.xlim() 只会对当前活动的坐标轴产生影响。如果图形中有多个子图,需要分别对每个子图的坐标轴调用
使用示例:
- plt.xlim()/plt.ylim()设置标签范围
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [4, 5, 6])
plt.xlim(0, 4) # 设置 x 轴范围从 0 到 4
plt.show()
2. ax.set_xlim()/ax.set_ylim()设置标签范围
import matplotlib.pyplot as plt
ax = plt.subplot()
plt.plot([1, 2, 3], [4, 5, 6])
ax.set_xlim(0, 4) # 设置 x 轴范围从 0 到 4
plt.show()
1.3轴刻度设置
轴刻度作为图形的一部分,由刻度线和刻度标签组成。绘图时plt会根据数据的特征显示合适的轴刻度线和刻度标签。数据量很少时,刻度标签可能和每个数据对应,数据量很大时,就会若干个数据才标注一个刻度。设置轴刻度使用plt.xticks()/plt.yticks()或ax.set_xticks()/ax.set_yticks()等方法。
plt.xticks()/plt.yticks()、ax.set_xticks()/ax.set_yticks()参数大致相同,以plt.xticks()为例,进行参数说明:
语法格式:
plt.xticks(ticks, labels, **kwargs)
- ticks:是一个数组或列表,包含要设置的 x 轴刻度的位置。
- labels:是一个数组、列表或可迭代对象,包含与 ticks 位置对应的刻度标签。其长度应与 ticks 相同。
- rotation:设置刻度标签的旋转角度,单位为度。
- fontsize:设置刻度标签的字体大小。
- color:设置刻度标签的颜色。
使用示例:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [4, 5, 6])
ticks = [1, 2, 3]
labels = ['One', 'Two', 'Three']
plt.xticks(ticks, labels, rotation=45, fontsize=12, color='red')
plt.show()
2.轴的高阶应用
2.1坐标轴的刻度样式
刻度由刻度标签和刻度线组成,可用使用plt.tick_params()/ax.tick_params()设置刻度格式。
tick_params()语法:
tick_params(axis='both', which='major', direction='out', length=3.5, width=0.8, color='black', pad=3.5, labelsize='medium', labelcolor=None, colors=None, zorder=None, gridOn=None, grid_color=None, grid_alpha=None, grid_linewidth=None, grid_linestyle=None, tick1On=None, tick2On=None, label1On=None, label2On=None, **kwargs)
常用参数说明:
- axis:"x"设置x轴,"y"设置y轴,"both"设置x和y轴。
- which:"major"设置主刻度线,"minor"设置次刻度线(默认不显示)。
- length:刻度线长度
- width:刻度线宽度
- colors:刻度线颜色
- labelsize:刻度标签文字大小
- labelcolor:刻度标签颜色
使用示例:
1.ax.tick_params()设置刻度格式
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot([1, 2, 3], [4, 5, 6])
# 使用面向对象的方式设置刻度参数
ax.tick_params(axis='y', length=12, width=3, color='green', labelsize=14, labelcolor='purple')
plt.show()
2.plt.tick_params()设置刻度格式
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [4, 5, 6])
plt.tick_params(axis='y', length=12, width=3, color='green', labelsize=14, labelcolor='purple')
plt.show()
2.2刻度标签和刻度线的个性化设置
画布上的任何内容都是一个Artist对象,可以获取这些对象做进一步设置。下面绘制一条余弦曲线,然后获取x轴的刻度标签和刻度线进行设置,这样可实现灵活的个性化设置,具体代码如下:
plt.figure()
x = np.linspace(-5,5,50)
plt.plot(x,np.sin(x))
ax = plt.gca() # 返回当前子图
for tlabel in ax.xaxis.get_ticklabels():# 获取x轴刻度标签并设置属性
tlabel.set_color('b')
tlabel.set_fontsize(16)
tlabel.set_rotation(10) # 文字旋转角度
for tline in ax.xaxis.get_ticklines(): # 获取x轴刻度线并设置属性
tline.set_markersize(8)
tline.set_markeredgewidth(2)
2.3双轴图
图形一般只有一个Y轴,但当我们需要在一个绘图区体现两个不同数量级或不同单位的组合图表时,就可以利用双Y轴图形实现。
在 matplotlib 里绘制双轴图的原理是借助 twinx() 方法。此方法能够创建一个新的坐标轴对象,它和已有的坐标轴共享 x 轴。在绘制双轴图时,先创建图形与第一个坐标轴,在这个坐标轴上绘制第一组数据并设置其相关属性。接着运用 twinx() 方法基于第一个坐标轴创建第二个坐标轴,第二个坐标轴的 x 轴范围和第一个相同,然后在第二个坐标轴上绘制第二组数据并设置对应属性。如此一来,就能在同一图表中展示两组不同量级的数据,且各自拥有独立的纵轴。
使用示例:
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.exp(x)
# 创建图形和第一个坐标轴
fig, ax1 = plt.subplots()
# 绘制第一个数据集
ax1.set_xlabel('X 轴')
ax1.set_ylabel('正弦函数值', color='red')
ax1.plot(x, y1, color='red')
ax1.tick_params(axis='y', labelcolor='red')
# 创建第二个 y 轴
ax2 = ax1.twinx()
# 绘制第二个数据集
ax2.set_ylabel('指数函数值', color='blue')
ax2.plot(x, y2, color='blue')
ax2.tick_params(axis='y', labelcolor='blue')
# 添加标题
plt.title('双轴图示例')
# 显示图形
plt.show()
2.4多子图共享坐标轴
在多个子图的绘制中,可能需要共享不同子图的坐标轴,以强化绘图区域的展示效果并精简绘图区域。这可通过在创建多子图的函数plt.subplots()中设置参数sharey或sharex来实现。
用例示例:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
fig, axes = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True) # 子图间共享x轴和y轴
for m in range(2):
for n in range(2): # 画2 行2列的随机直方图
axes[m, n].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
语句“plt.subplots(2,2,sharex=True,sharey=True)”创建了2行2列4个子图,设置各子图共享x轴和y轴。
3.图表配色
在数据可视化里,图表配色的作用不容小觑。一方面,它极大地增强数据辨识度。在呈现多组数据时,不同颜色可精准区分各个类别,比如在展示各品牌手机销量占比的饼图中,不同品牌对应不同颜色,让用户一眼看清各品牌的市场份额差异。同时,鲜明的颜色能突出重点数据,像在公司利润增长折线图里,用红色标记利润大幅下滑的月份,能迅速吸引关注。另一方面,它巧妙引导视觉流向,借由合理的色彩搭配建立视觉层次,引导用户按设计思路理解数据,助力信息高效传递 。
3.1颜色参数
(1)预定义颜色名称
matplotlib 支持许多预定义的颜色名称,使用简单方便。常见的预定义颜色名称如下:
b(蓝色)、g(绿色)、r(红色)、c(青色)、m(洋红色)、y(黄色)、k(黑色)、w(白色)
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, color='r')
plt.plot(x, y+1, color='b')
plt.plot(x, y+2, color='y')
plt.show()
(2) 十六进制颜色码
在matplotlib中,还可以使用 HTML 十六进制颜色码来指定颜色,格式为 #RRGGBB,其中 RR、GG、BB 分别代表红、绿、蓝通道的十六进制值,范围从 00 到 FF。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0, 2*np.pi, 0.01)
y = np.cos(x)
plt.plot(x, y+4, c="blue") # blue或b均表示蓝色
plt.plot(x, y+3, c="b")
plt.plot(x, y+2, color="#b2334d") # 十六进制RGB格式,对应十进制(178,51,77)
plt.plot(x, y+1, color=(178/255, 51/255, 77/255)) # 与上面颜色相同
plt.plot(x, y, color=(0.7, 0.2, 0.3)); # 与上面颜色相同
(3)灰度值
颜色参数可以为一个浮点数,用一个 0 到 1 之间的浮点数来表示灰度值,0 代表黑色,1 代表白色。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y, color='0.5')
plt.show()
3.2颜色映射与颜色标尺
(1)颜色映射
在 matplotlib 里,颜色映射表(Colormap)能够把数值映射为颜色,这在可视化连续数据或者表示数据强度时极为有用。
可使用plt.colormaps()查看所有可用的颜色列表,matplotlib 提供了多种内置颜色映射表,主要可分为以下几类:
- 顺序型(Sequential):适用于表示从低到高连续变化的数据,颜色从一种颜色平滑过渡到另一种颜色。例如 viridis、plasma、inferno、magma 等,这些颜色映射表在数据可视化中广泛使用,因为它们对色盲人群友好且具有良好的亮度变化。
- 发散型(Diverging):适合展示以某个中心值为基准,向两个方向变化的数据。像 coolwarm、bwr(蓝 - 白 - 红)等,中心颜色通常代表中间值,两侧颜色分别表示高于和低于中间值的数据。
- 定性型(Qualitative):用于区分不同的类别,颜色之间没有明显的顺序关系。例如 tab10、tab20 等,这些颜色映射表中的颜色具有较高的对比度,方便区分不同的类别。
- 循环型(Cyclic):当数据具有周期性时使用,颜色首尾相连形成循环。例如 hsv 颜色映射表,它的颜色呈现出彩虹般的循环效果。
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
z = np.cos(x)
# 创建一个图形和坐标轴
fig, ax = plt.subplots()
# 使用颜色映射表绘制散点图
sc = ax.scatter(x, y, c=z, cmap='viridis')
# 显示图形
plt.show()
(2)颜色标尺
颜色映射表完成了数值和颜色的转换,我们还可以在图形旁边添加一个颜色标尺以便清楚地展示颜色和数值的对应关系。在matplotlib中,通常使用 colorbar() 方法来创建颜色标尺。
plt.colorbar() 函数通常结合其他绘图函数一起使用,比如 scatter()、imshow()、contourf() 等,这些函数在绘图时会根据数据值使用颜色映射来分配颜色。使用示例如下:
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
x = np.random.rand(50)
y = np.random.rand(50)
z = np.random.rand(50)
# 绘制散点图,颜色由 z 的值决定
sc = plt.scatter(x, y, c=z, cmap='viridis')
# 添加颜色条
plt.colorbar(sc)
plt.show()
上述代码中,plt.colorbar(sc) 为散点图添加了颜色条,展示了颜色和 z 值之间的对应关系。
4.文本属性设置
图形中的文本非常重要,起到说明、注释和强调的作用。图形标题、轴标签和刻度标签都是文本对象。对文本通常做字体(family)、字体风格(style)、字体粗细(weight)、字体大小(size)等方面的设置。
字体常见的属性有:
- fontsize(字体大小):用于控制文本的大小。可以是整数或浮点数,代表字体的磅值(pt),数值越大字体越大;也可以使用预定义的字符串,如 ‘xx-small’、‘x-small’、‘small’、‘medium’、‘large’、‘x-large’、‘xx-large’。
- fontweight(字体粗细):用于设置字体的粗细程度。可以是数值(如 100 - 900,值越大字体越粗),也可以是预定义的字符串,如’light’、‘normal’、‘medium’、‘semibold’、‘bold’、‘heavy’、‘black’。
- fontstyle(字体样式):用于设置字体的样式,如正常、斜体等。‘normal’(正常)、‘italic’(斜体)、‘oblique’(倾斜体)。
- fontfamily(字体族):用于指定使用的字体族。可以是具体的字体名称(如 ‘serif’、‘sans-serif’、‘monospace’、‘cursive’、‘fantasy’),也可以是系统中安装的具体字体名称(如 ‘Arial’、‘Times New Roman’)。
使用示例:
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['SimHei', 'KaiTi']
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 设置中文字体
plt.rcParams['font.family'] = 'SimHei'
# 创建一个图形
plt.figure(figsize=(10, 8))
# fontsize 示例
plt.text(0.1, 0.9, '字体大小示例:大字体', fontsize=24)
plt.text(0.1, 0.8, '字体大小示例:小字体', fontsize=10)
# fontweight 示例
plt.text(0.1, 0.7, '字体粗细示例:粗体', fontweight='bold')
plt.text(0.1, 0.6, '字体粗细示例:正常', fontweight='normal')
# fontstyle 示例
plt.text(0.1, 0.5, '字体样式示例:斜体', fontstyle='italic')
plt.text(0.1, 0.4, '字体样式示例:正常', fontstyle='normal')
# fontfamily 示例
plt.text(0.1, 0.3, '字体族示例:黑体', fontfamily='SimHei')
plt.text(0.1, 0.2, '字体族示例:楷体', fontfamily='KaiTi')
# 隐藏坐标轴
plt.axis('off')
# 显示图形
plt.show()