Python数据可视化-第3章-图表辅助元素的定制
教材
本书为《Python数据可视化》一书的配套内容,本章为第3章-图表辅助元素的定制
本章主要介绍了图表辅助元素的定制,包括认识常用的辅助元素、设置坐标轴的标签、设置刻度范围和刻度标签、添加标题和图例、显示网格、添加参考线和参考区域、添加注释文本、添加表格。
参考
政务可视化设计经验-图表习惯
数据可视化设计必修课(一):图表篇
一文讲透 | 大屏数据可视化图表选用指南
第3章 图表辅助元素的定制
3.1 认识图表常用的辅助元素
图表的辅助元素是指除了根据数据绘制的图形之外的元素,常用的辅助元素包括坐标轴、标题、图例、网格、参考线、参考区域、注释文本和表格,它们都可以对图形进行补充说明。
3.2 设置坐标轴的标签、刻度范围和刻度标签
3.2.1 设置坐标轴的标签
xlabel()函数
使用pyplot模块的xlabel()函数可以设置x轴的标签。
xlabel(xlabel, fontdict=None, labelpad=None, **kwargs)
xlabel:表示x轴标签的
文本。
fontdict:表示控制标签文本样式的字典。
labelpad:表示标签与x轴轴脊间的距离。
ylabel()函数
使用pyplot模块的ylabel()函数可以设置y轴的标签。
ylabel(ylabel, fontdict=None, labelpad=None, **kwargs)
ylabel:表示y轴标签的
文本。
fontdict:表示控制标签文本样式的字典。
labelpad:表示标签与y轴轴脊的距离。
注意
Axes对象使用set_xlabel()方法可以设置x轴的标签,使用set_ylabel()方法可以设置y轴的标签。set_xlabel()、set_ylabel()方法与xlabel()、ylabel()函数的参数用法相同。
案例

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
plt.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
plt.xlabel("x轴")
plt.ylabel("y轴")
plt.show()
3.2.2 设置刻度范围和刻度标签
设置刻度范围xlim()和ylim()
使用pyplot模块的xlim()和ylim()函数分别可以设置或获取x轴和y轴的刻度范围。
xlim(left=None, right=None, emit=True, auto=False, *, xmin=None, xmax=None)
left:表示x轴刻度取值区间的
左位数。
right:表示x轴刻度取值区间的右位数。
emit:表示是否通知限制变化的观察者,默认为True。
auto:表示是否允许自动缩放x轴,默认为True。
此外,Axes对象可以使用set_xlim()或set_ylim()方法设置x轴或y轴的刻度范围。
设置刻度标签 xticks()或yticks()
使用pyplot模块的xticks()或yticks()函数可以设置x轴或y轴的刻度线位置和刻度标签。
xticks(ticks=None, labels=None, **kwargs)
ticks:表示
刻度显示的位置列表,该参数可以设置为空列表,以此禁用x轴的刻度。
labels:表示指定位置刻度的标签列表。
此外,Axes对象可以使用set_xticks()或set_yticks()方法设置x轴或y轴的刻度线位置,使用set_xticklabels()或set_yticklabels()方法设置x轴或y轴的刻度标签。
案例

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
# plt.plot(x, y1, x, y2)
# # 设置 x 轴和 y 轴的标签
# plt.xlabel("x轴")
# plt.ylabel("y轴")
# # 设置 x 轴的刻度范围和刻度标签
# plt.xlim(x.min() * 1.5, x.max() * 1.5)
# plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',
# r'$0$', r'$\pi/2$', r'$\pi$'])fig,ax = plt.subplots()
ax.plot(x, y1, x, y2)
ax.set_xlabel("x轴")
ax.set_ylabel("y轴")
ax.set_xlim(x.min() * 1.5, x.max() * 1.5)
ax.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$', r'$0$', r'$\pi/2$', r'$\pi$'])plt.show()
实例1:2019年中国电影票房排行榜
# 01_film_rankings
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams["axes.unicode_minus"] = False
labels = ["哪吒之魔童降世", "流浪地球", "复仇者联盟4:终局之战", "疯狂的外星人", "飞驰人生", "烈火英雄", "蜘蛛侠:英雄远征", "速度与激情:特别行动", "扫毒2天地对决", "大黄蜂","惊奇队长", "比悲伤更悲伤的故事", "哥斯拉2:怪兽之王", "阿丽塔:战斗天使", "银河补习班"]
bar_width = [48.57, 46.18, 42.05, 21.83, 17.03, 16.70, 14.01, 13.84, 12.85, 11.38, 10.25, 9.46, 9.27, 8.88, 8.64]
y_data = range(len(labels))
fig = plt.figure()
ax = fig.add_subplot(111)
ax.barh(y_data, bar_width, height=0.2, color='orange')
# 设置 x 轴和 y 轴的标签
ax.set_xlabel("总票房(亿元)")
ax.set_ylabel("电影名称")
# 设置 y 轴的刻度线位置、刻度标签
ax.set_yticks(y_data)
ax.set_yticklabels(labels)
plt.show()

3.3 添加标题和图例
3.3.1 添加标题 title()函数
使用pyplot模块的title()函数可以添加图表标题。
title(label, fontdict=None, loc='center', pad=None, **kwargs)
label:表示
标题的文本。
fontdict:表示控制标题文本样式的字典。
loc:表示标题的对齐样式。
pad:表示标题与图表顶部的距离,默认为None。
Axes对象还可以使用set_title()方法为图表添加标题。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
plt.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
plt.xlabel("x轴")
plt.ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
plt.xlim(x.min() * 1.5, x.max() * 1.5)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
plt.title("正弦曲线和余弦曲线")
plt.show()
3.3.2 添加图例 legend()函数

使用pyplot模块的legend()函数可以为图表添加图例。
legend(handles, labels, loc, bbox_to_anchor, ncol, title, shadow, fancybox, *args, **kwargs)
handles:表示由
图形标识构成的列表。
labels:表示由图例项构成的列表。
loc:用于控制图例在图表中的位置。loc参数的两种形式的取值及说明如下图
bbox_to_anchor:用于控制图例的布局。
ncol:表示图例的列数,默认值为1。
title:表示图例的标题,默认值为None。
shadow :表示是否在图例后面显示阴影,默认值为None。
fancybox:表示是否为图例设置圆角边框,默认值为None
在使用pyplot的绘图函数绘图时,若已经预先通过
label参数指定了显示于图例的标签,则后续可以直接调用legend()函数添加图例。
若未预先指定应用于图例的标签,则后续在调用legend()函数时为handles和labels参数传值即可。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
lines = plt.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
plt.xlabel("x轴")
plt.ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
plt.xlim(x.min() * 1.5, x.max() * 1.5)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
plt.title("正弦曲线和余弦曲线")
# 添加图例
plt.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)
plt.show()
3.3.3 实例2:支付宝月账单报告(添加标题和图例)
支付宝月账单报告的饼图中每个扇形的含义均标注到圆外,由于代表每个扇形含义的文字长短不一且数量偏多,导致
图表显得比较杂乱。
本实例要求将原饼图中所有的标注文字移动到图例中,以图例的形式来标注每个扇形代表的含义,并且在饼图正上方位置添加标题。
# 02_monthly_bills_of_alipay
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
kinds = ['购物', '人情往来', '餐饮美食', '通信物流', '生活日用', '交通出行', '休闲娱乐', '其他']
money_scale = [800 / 3000, 100 / 3000, 1000 / 3000, 200 / 3000, 300 / 3000, 200 / 3000, 200 / 3000, 200 / 3000]
dev_position = [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
plt.pie(money_scale, autopct='%3.1f%%', shadow=True, explode=dev_position, startangle=90)
# 添加标题
plt.title('支付宝月账单报告')
# 添加图例
plt.legend(kinds, loc='upper right', bbox_to_anchor=[1.3, 1.1])
plt.show()
3.4 显示网格
3.4.1 显示指定样式的网格 grid()函数
网格是从刻度线开始延伸,贯穿至整个绘图区域的辅助线条,它能帮助人们轻松地查看图形的数值。网格可以分为
垂直网格和水平网格,这两种网格既可以单独使用,也可以同时使用。
使用pyplot模块的grid()函数可以显示图表中的网格。
#grid(b=None, which='major', axis='both', **kwargs)
grid(visible=None, which='major', axis='both', **kwargs)
b:表示是否显示网格。新版本不采用b作为参数名
visible:表示是否显示网格。
which:表示显示网格的类型,支持’ major’ (主刻度网格线)、’ minor’ (次要刻度网格线) 、’ both’ (两者)三种取值,默认为major。
axis:表示显示哪个方向的网格,支持’both’(两者)、‘x’(垂直网格)和’y’ (水平网格)三种取值,默认为’both’ 。
linewidth 或 lw:网格线的宽度。
还可以使用Axes对象的grid()方法显示网格。
若坐标轴没有刻度,则将无法显示网格。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
lines = plt.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
plt.xlabel("x轴")
plt.ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
plt.xlim(x.min() * 1.5, x.max() * 1.5)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
plt.title("正弦曲线和余弦曲线")
# 添加图例
plt.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)
# 显示网格
# 参数的作用:
# True 表示显示网格 x y both
plt.grid(visible=True, axis='y', linewidth=0.3)
plt.show()
3.4.2 实例3:汽车速度与制动距离的关系(添加网格)
# 03_vehicle_speed_and_braking_distance
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
x_speed = np.arange(10, 210, 10)
y_distance = np.array([0.5, 2.0, 4.4, 7.9, 12.3, 17.7, 24.1, 31.5, 39.9, 49.2,59.5, 70.8, 83.1, 96.4, 110.7,126.0, 142.2, 159.4, 177.6, 196.8])
plt.scatter(x_speed, y_distance, s=50, alpha=0.9, linewidths=0.3)
# 设置 x 轴的标签、刻度标签
plt.xlabel('速度(km/h)')
plt.ylabel('制动距离(m)')
plt.xticks(x_speed)
# 显示网格
plt.grid(True, linewidth=0.3)
plt.show()

3.5 添加参考线和参考区域
3.5.1 添加参考线 axhline()函数 和axvline()函数
参考线是一条或多条贯穿绘图区域的线条,用于为绘图区域中图形数据之间的比较提供参考依据,比如目标线、平均线、预算线等。参考线按方向的不同可分为
水平参考线和垂直参考线。
使用pyplot模块的axhline()函数可以为图表添加水平参考线。
axhline(y=0, xmin=0, xmax=1, linestyle='-', **kwargs)
y:表示
水平参考线的y坐标。
xmin:表示水平参考线的起始位置,默认为0。
xmax:表示水平参考线的终止位置,默认为1。
linestyle:表示水平参考线的类型,默认为实线。
使用pyplot模块的axvline()函数可以为图表添加垂直参考线。
axvline(x=0, ymin=0, ymax=1, linestyle='-', **kwargs)
x:表示垂直参考线的
x坐标。
ymin:表示垂直参考线的起始位置,默认为0。
ymax:表示垂直参考线的终止位置,默认为1。
linestyle:表示垂直参考线的类型,默认为实线。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
lines = plt.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
plt.xlabel("x轴")
plt.ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
plt.xlim(x.min() * 1.5, x.max() * 1.5)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
plt.title("正弦曲线和余弦曲线")
# 添加图例
plt.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)
# 显示网格
plt.grid(True, axis='y', linewidth=0.3)
# 添加参考线
plt.axvline(x=0, linestyle='--')
plt.axhline(y=0, linestyle='--')
plt.show()
3.5.2 添加参考区域 axhspan()函数 和 axvspan()函数
使用pyplot模块的axhspan()函数可以为图表添加水平参考区域。
axhspan(ymin, ymax, xmin=0, xmax=1, **kwargs)
ymin:表示
水平跨度的下限,以数据为单位。
ymax:表示水平跨度的上限,以数据为单位。
alpha:表示参考区域的透明度。
使用pyplot模块的axvspan()函数可以为图表添加垂直参考区域。
axvspan(xmin, xmax, ymin=0, ymax=1, **kwargs)
xmin:表示
垂直跨度的下限。
xmax:表示垂直跨度的上限。
alpha:表示参考区域的透明度。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
lines = plt.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
plt.xlabel("x轴")
plt.ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
plt.xlim(x.min() * 1.5, x.max() * 1.5)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
plt.title("正弦曲线和余弦曲线")
# 添加图例
plt.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)
# 显示网格
plt.grid(True, axis='y', linewidth=0.3)
# 添加参考线
plt.axvline(x=0, linestyle='--')
plt.axhline(y=0, linestyle='--')
# 添加参考区域
plt.axvspan(xmin=0.5, xmax=2.0, alpha=0.3)
plt.axhspan(ymin=0.5, ymax=1.0, alpha=0.3)
plt.show()
3.5.3 实例4:全校高二年级各班男女生英语成绩评估
已知某高校对高二年级学生进行模拟考试后,统计了高二年级每个班级的英语学科平均成绩,并计算出
全体高二年级的英语平均成绩为88.5。
本实例要求根据下表的数据,绘制展示各班男生、女生英语平均成绩的柱形图,并在该柱形图中标注出代表全体高二年级英语平均成绩的参考线。
# 04_average_score_of_english
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
men_means = (90.5, 89.5, 88.7, 88.5, 85.2, 86.6)
women_means = (92.7, 87.0, 90.5, 85.0, 89.5, 89.8)
ind = np.arange(len(men_means)) # 每组柱形的 x 位置
width = 0.2 # 各柱形的宽度
fig = plt.figure()
ax = fig.add_subplot(111)
ax.bar(ind - width / 2, men_means, width, label='男生平均成绩')
ax.bar(ind + 0.2, women_means, width, label='女生平均成绩')
ax.set_title(' 高二各班男生、女生英语平均成绩')
ax.set_ylabel('分数')
ax.set_xticks(ind)
ax.set_xticklabels(['高二1班', '高二2班', '高二3班', '高二4班', '高二5班', '高二6班'])
# 添加参考线
ax.axhline(88.5, ls='--', linewidth=1.0, label='全体平均成绩')
ax.legend(loc="lower right")
plt.show()
3.6 添加注释文本
注释文本按注释对象的不同主要分为
指向型注释文本和无指向型注释文本,其中指向型注释文本一般是针对图表某一部分的特定说明,无指向型注释文本一般是针对图表整体的特定说明。
3.6.1 添加指向型注释文本 annotate()函数
指向型注释文本是指通过指示箭头的注释方式对绘图区域的图形进行解释的文本,它一般使用线条连接说明点和箭头指向的注释文字。
使用pyplot模块的annotate()函数可以为图表添加指向型注释文本。
annotate(s, xy, *args, **kwargs)
s:表示
注释文本的内容。
xy:表示被注释对象的坐标位置,接收元组(x,y)。
xytext :表示注释文本所在的坐标位置,接收元组(x,y)。
bbox:表示注释文本的边框属性。
arrowprops :表示指示箭头的属性。
arrowprops 参数接收一个包含若干键的字典,通过向字典中添加键值对以控制箭头的显示。常见的控制箭头的键包括width(箭头宽度)、headwidth(头宽)、headlength(头长)、arrowstyle(箭头类型)等。键arrowstyle代表箭头的类型,该键对应的值及其类型如下图所示。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
lines = plt.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
plt.xlabel("x轴")
plt.ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
plt.xlim(x.min() * 1.5, x.max() * 1.5)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
plt.title("正弦曲线和余弦曲线")
# 添加图例
plt.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)
# 显示网格
plt.grid(True, axis='y', linewidth=0.3)
# 添加参考线
plt.axvline(x=0, linestyle='--')
plt.axhline(y=0, linestyle='--')
# 添加参考区域
plt.axvspan(xmin=0.5, xmax=2.0, alpha=0.3)
plt.axhspan(ymin=0.5, ymax=1.0, alpha=0.3)
# 添加指向型注释文本
plt.annotate("最小值",xy=(-np.pi / 2, -1.0),xytext=(-(np.pi / 2), -0.5),arrowprops=dict(arrowstyle="->"))
plt.show()

3.6.2 添加无指向型注释文本 text()函数
无指向型注解文本是指仅使用文字的注释方式对绘图区域的图形进行说明的文本。
使用pyplot模块的text()函数可以为图表添加无指向型注释文本。
text(x, y, s, fontdict=None, withdash=<deprecated parameter>, **kwargs)
x, y:表示x坐标和y坐标,用于确定
注释文本的位置。
s:表示注释文本的内容。
horizontalalignment或ha:表示水平对齐的方式,可以取值为’center’、‘right’或 ‘left’。
verticalalignment或va:表示垂直对齐的方式,可以取值为’center’、‘top’、‘bottom’、‘baseline’或’center_baseline’

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
lines = plt.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
plt.xlabel("x轴")
plt.ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
plt.xlim(x.min() * 1.5, x.max() * 1.5)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
plt.title("正弦曲线和余弦曲线")
# 添加图例
plt.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)
# 显示网格
plt.grid(True, axis='y', linewidth=0.3)
# 添加参考线
plt.axvline(x=0, linestyle='--')
plt.axhline(y=0, linestyle='--')
# 添加参考区域
plt.axvspan(xmin=0.5, xmax=2.0, alpha=0.3)
plt.axhspan(ymin=0.5, ymax=1.0, alpha=0.3)
# 添加指向型注释文本
plt.annotate("最小值",xy=(-np.pi / 2, -1.0),xytext=(-(np.pi / 2), -0.5),arrowprops=dict(arrowstyle="->"))
# 添加无指向型注释文本
plt.text(3.10, 0.10, "y=sin(x)", bbox=dict(alpha=0.2))
plt.show()

多学一招:matplotlib编写数学表达式
matplotlib中自带mathtext引擎,通过该引擎可以自动识别使用annotate()或text()函数传入的数学字符串,并解析成对应的
数学表达式。
数学字符串有着固定的格式,它要求字符串以美元符号“$”为首尾字符,且首尾字符中间包裹数学表达式。
'$数学表达式$'
为保证字符串中的所有字符能以字面的形式显示,数学字符串需要配合“r”使用

\alpha”和“\beta”的后面还可以增加上标和下标,其中上标使用符号“^”表示,下标使用符号“_”表示。

matplotlib中使用“ \frac{}{}”可以编写分数形式的数字字符串,“\frac”的后面的两个中括号分别代表分数的分子和分母。

还可以编写分数嵌套的数学字符串。

3.6.3 实例5:2013—2019财年阿里巴巴淘宝和天猫平台的GMV(添加注释文本)
柱形图经常会与注释文本配合使用,在
柱形的顶部标注柱形对应的具体数值。2.2.2节实例中的柱形图描述了阿里巴巴淘宝和天猫平台的GMV,但图中的矩形条缺少具体的数值。
本实例要求对前面的柱形图进行调整,在每个柱形的顶部添加无指向型注释文本,并设置y轴的标签。
# 05_taobao_and_tianmao_GMV
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(1, 8)
y = np.array([10770, 16780, 24440, 30920, 37670, 48200, 57270])
bar_rects = plt.bar(x, y, tick_label=["FY2013", "FY2014", "FY2015","FY2016", "FY2017", "FY2018", "FY2019"], width=0.5)
# 添加无指向型注释文本
def autolabel(rects):""" 在每个矩形条的上方附加一个文本标签, 以显示其高度"""for rect in rects:height = rect.get_height() # 获取每个矩形条的高度plt.text(rect.get_x() + rect.get_width() / 2, height + 300, s='{}'.format(height),ha='center', va='bottom')
autolabel(bar_rects)
plt.ylabel('GMV(亿元)')
plt.show()

3.7 添加表格
3.7.1 添加自定义样式的表格table()函数
使用pyplot模块的table()函数可以为图表添加数据表格。
table(cellText=None, cellColours=None, cellLoc='right', colWidths=None, …, **kwargs)
cellText:表示
表格单元格中的数据,可以是一个二维列表。
cellColours:表示单元格的背景颜色。
cellLoc:表示单元格文本的对齐方式,支持’left’、‘center’、‘right’三种取值,默认值为’right’。
colWidths:表示每列的宽度。
rowLabels:表示行标题的文本。
rowLoc:表示行标题的对齐方式,支持‘left’、‘center’、‘right’三种取值,默认值是‘left’ 。
colLabels:表示列标题的文本。
colColours:表示列标题所在单元格的背景颜色。
colLoc:表示列标题的对齐方式, 默认为左对齐。
loc:表示表格与绘图区域的对齐方式。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
lines = plt.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
plt.xlabel("x轴")
plt.ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
plt.xlim(x.min() * 1.5, x.max() * 1.5)
plt.xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
plt.title("正弦曲线和余弦曲线")
# 添加图例
plt.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)
# 显示网格
plt.grid(True, axis='y', linewidth=0.3)
# 添加参考线
plt.axvline(x=0, linestyle='--')
plt.axhline(y=0, linestyle='--')
# 添加参考区域
plt.axvspan(xmin=0.5, xmax=2.0, alpha=0.3)
plt.axhspan(ymin=0.5, ymax=1.0, alpha=0.3)
# 添加指向型注释文本
plt.annotate("最小值",xy=(-np.pi / 2, -1.0),xytext=(-(np.pi / 2), -0.5),arrowprops=dict(arrowstyle="->"))
# 添加无指向型注释文本
plt.text(3.10, 0.10, "y=sin(x)", bbox=dict(alpha=0.2))
# 添加表格
plt.table(cellText=[[6, 6, 6], [8, 8, 8]], colWidths=[0.1] * 3, rowLabels=['第1行', '第2行'], colLabels=['第1列', '第2列', '第3列'], loc='lower right')
plt.show()

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
x = np.linspace(-np.pi, np.pi, 256, endpoint=True)
y1, y2 = np.sin(x), np.cos(x)
fig = plt.figure(figsize=(12, 6))ax1 = fig.add_subplot(2, 1, 1)
lines = ax1.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
ax1.set_xlabel("x轴")
ax1.set_ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
ax1.set_xlim(x.min() * 1.5, x.max() * 1.5)
ax1.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
ax1.set_title("正弦曲线和余弦曲线")# 添加图例
ax1.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)# 显示网格
ax1.grid(True, axis='y', linewidth=0.3)# 添加参考线
ax1.axhline(y=0, linestyle='--')
ax1.axvline(x=0, linestyle='--')
# 添加参考区域
ax1.axvspan(xmin=0.5, xmax=2.0, alpha=0.3)
ax1.axhspan(ymin=0.5, ymax=1.0, alpha=0.3)
# 添加指向型注释文本
ax1.annotate("最大值",xy=(np.pi / 2, 1.0),xytext=(np.pi / 3, 0.5),arrowprops=dict(arrowstyle="->"))# 添加无指向型注释文本
ax1.text(3.10, 0.10, "y=sin(x)", bbox=dict(alpha=0.2))
# 添加表格
ax1.table(cellText=[[6, 6, 6], [8, 8, 8]], colWidths=[0.1] * 3, rowLabels=['第1行', '第2行'], colLabels=['第1列', '第2列', '第3列'], loc='lower right')# 绘制第二个子图
ax2 = fig.add_subplot(2, 1, 2)
lines = ax2.plot(x, y1, x, y2)
# 设置 x 轴和 y 轴的标签
ax2.set_xlabel("x轴")
ax2.set_ylabel("y轴")
# 设置 x 轴的刻度范围和刻度标签
ax2.set_xlim(x.min() * 1.5, x.max() * 1.5)
ax2.set_xticks([-np.pi, -np.pi/2, 0, np.pi/2, np.pi], [r'$-\pi$', r'$-\pi/2$',r'$0$', r'$\pi/2$', r'$\pi$'])
# 添加标题
ax2.set_title("正弦曲线和余弦曲线2")# 添加图例
ax2.legend(lines, ['正弦', '余弦'], shadow=True, fancybox=True)# 显示网格
ax2.grid(True, axis='y', linewidth=0.3)# 添加参考线
ax2.axhline(y=0, linestyle='--')
ax2.axvline(x=0, linestyle='--')
# 添加参考区域
ax2.axvspan(xmin=0.5, xmax=2.0, alpha=0.3)
ax2.axhspan(ymin=0.5, ymax=1.0, alpha=0.3)
# 添加指向型注释文本
ax2.annotate("最大值",xy=(np.pi / 2, 1.0),xytext=(np.pi / 3, 0.5),arrowprops=dict(arrowstyle="->"))# 添加无指向型注释文本
ax2.text(3.10, 0.10, "y=sin(x)", bbox=dict(alpha=0.2))
# 添加表格
ax2.table(cellText=[[6, 6, 6], [8, 8, 8]], colWidths=[0.1] * 3, rowLabels=['第1行', '第2行'], colLabels=['第1列', '第2列', '第3列'], loc='lower right')# 子图ax1和ax2之间增加边框和距离
fig.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9,wspace=0.4, hspace=0.4)
plt.show()

3.7.2 实例6:果酱面包配料比例
美好的一天从早餐开始,
果酱面包是一道深受大家喜爱的美食,无论是大人还是小孩,都对果酱面包赞不绝口。
本实例要求根据下表的数据,将配料名称列的数据作为图例项,将重量列的数据与总重量的比例作为数据,使用pie()绘制果酱面包配料比例的饼图,并将各种配料的重量以数据表格的形式添加到图表中,方便用户了解各种配料的占比和重量。
# 06_jam_bread_ingredients
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
kinds = ['面粉', '全麦粉', '酵母', '苹果酱', '鸡蛋', '黄油', '盐', '白糖']
weight = [250, 150, 4, 250, 50, 30, 4, 20]
total_weight = 0
for i in weight:total_weight += i
batching_scale = [i / total_weight for i in weight]
plt.pie(batching_scale, autopct='%3.1f%%')
plt.legend(kinds, loc='upper right', bbox_to_anchor=[1.1, 1.1])
# 添加表格
plt.table(cellText=[weight], cellLoc='center', rowLabels=['重量(g)'], colLabels=kinds, loc='lower center')
plt.show()
相关文章:
Python数据可视化-第3章-图表辅助元素的定制
教材 本书为《Python数据可视化》一书的配套内容,本章为第3章-图表辅助元素的定制 本章主要介绍了图表辅助元素的定制,包括认识常用的辅助元素、设置坐标轴的标签、设置刻度范围和刻度标签、添加标题和图例、显示网格、添加参考线和参考区域、添加注释文…...
`git commit --amend` 详解:修改提交记录的正确方式
文章目录 git commit --amend 详解:修改提交记录的正确方式1. 修改提交信息2. 补充遗漏的文件3. 结合 --amend 进行交互式修改4. 已推送提交的修改总结 git commit --amend 详解:修改提交记录的正确方式 git commit --amend 用于修改最近一次的提交&…...
Linux系统下C语言fork函数使用案例
一、fork函数的作用 生成一个子进程,异步执行某个任务; 二、子进程的作用 1、子进程能复制一份父进程的变量、函数; 2、子进程可以和父进程同时并发执行; 函数语法: pid_t fork() 说明:调用后返回一个进程…...
springboot实现异步导入Excel的注意点
springboot实现异步导入Excel 需求前言异步导入面临的问题实现异步如何导入大Excel文件避免OOM?异步操作后,如何通知导入结果?如何加快导入效率?将导入结果通知给用户后,如何避免重复通知? 优化点完结撒花&…...
Linux练习——有关硬盘、联网、软件包的管理
1、将你的虚拟机的网卡模式设置为nat模式,给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 #使用nmtui打开文本图形界面配置网络 [rootrhcsa0306 ~]# nmtui #使用命令激活名为 ens160 的 NetworkManager 网络连接 [rootrhcsa0306 ~]# nmcli c up ens160 #通…...
论文阅读:GS-Blur: A 3D Scene-Based Dataset for Realistic Image Deblurring
今天介绍一篇 2024 NeurIPS 的文章,是关于真实世界去模糊任务的数据集构建的工作,论文作者来自韩国首尔大学 Abstract 要训练去模糊网络,拥有一个包含成对模糊图像和清晰图像的合适数据集至关重要。现有的数据集收集模糊图像的方式主要有两…...
经典动态规划问题:爬楼梯的多种解法详解
引言 今天我们要解决一个经典的算法问题——爬楼梯问题。这个问题看似简单,但蕴含了多种解法,从递归到动态规划,再到组合数学,每种方法都有其独特的思路和优化方式。本文将详细讲解四种解法,并通过代码和图解帮助大家…...
Kubernetes深度解析:云原生时代的容器编排引擎
一、背景与演进 1. 容器革命的必然产物 Kubernetes(K8s)诞生于2014年,是Google基于其内部Borg系统的开源实现。在传统单体应用向微服务架构转型的浪潮中,容器技术(如Docker)解决了应用打包和环境隔离问题…...
Cocos Creator Shader入门实战(七):RGB不同算法效果的实现,及渲染技术、宏定义、属性参数的延伸配置
引擎:3.8.5 您好,我是鹤九日! 回顾 上篇文章,讲解了Cocos Shader如何通过setProperty动态设置材质的属性,以及设置属性时候的一些注意事项,比如: 一、CCEffect部分properties参数的设定后&…...
leetcode102 二叉树的层次遍历 递归
(1) 找出重复的子问题。 层次遍历是每一层的节点从左到右的遍历,所以在遍历的时候我们可以先遍历左子树,再遍历右子树。 需要注意的是,在遍历左子树或者右子树的时候,涉及到向上或者向下遍历,为了让递归的过程中的同…...
Netty源码—10.Netty工具之时间轮二
大纲 1.什么是时间轮 2.HashedWheelTimer是什么 3.HashedWheelTimer的使用 4.HashedWheelTimer的运行流程 5.HashedWheelTimer的核心字段 6.HashedWheelTimer的构造方法 7.HashedWheelTimer添加任务和执行任务 8.HashedWheelTimer的完整源码 9.HashedWheelTimer的总结…...
算法学习记录:递归
递归算法的关键在于回复现场,dfs()函数返回值、结束条件、它的作用。 目录 1.综合练习 2. 二叉树的深搜 1.综合练习 39. 组合总和 - 力扣(LeetCode) 关键在画出的决策树当中,前面使用过的2、3,…...
启山智软实现b2c单商户商城对比传统单商户的优势在哪里?
启山智软实现 B2C 单商户商城具有以下对比优势: 技术架构方面 先进的框架选型:基于 SpringCloud 等主流框架开发,是百万真实用户沉淀并检验的商城系统,技术成熟稳定,能应对高并发场景,保证系统在大流量访…...
可发1区的超级创新思路(python\matlab实现):MPTS+Lconv+注意力集成机制的Transformer时间序列模型
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等。 一、模型整体架构(本文以光伏功率预测为例) 本模型由多尺度特征提取模块(MPTS)…...
三、分类模块,通用组件顶部导航栏Navbar
1.封装通用组件顶部导航栏Navbar 不同效果 Component export struct MkNavbar {Prop title: string Prop leftIcon: ResourceStr $r("app.media.ic_public_left")ProprightIcon: ResourceStr $r("app.media.ic_public_more")PropshowLeftIcon: boolean…...
PHY——LAN8720A 寄存器读写 (二)
文章目录 PHY——LAN8720A 寄存器读写 (二)工程配置引脚初始化代码以太网初始化代码PHY 接口实现LAN8720 接口实现PHY 接口测试 PHY——LAN8720A 寄存器读写 (二) 工程配置 这里以野火电子的 F429 开发板为例,配置以太网外设 这里有一点需要注意原理图 RMII_TXD0…...
Flutter_学习记录_AppBar中取消leading的占位展示
将leading设置为null将automaticallyImplyLeading设置为false 看看automaticallyImplyLeading的说明: Controls whether we should try to imply the leading widget if null. If true and [AppBar.leading] is null, automatically try to deduce what the leading…...
PHP泛型与集合的未来:从动态类型到强类型的演进
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
未来派几何风格包装徽标品牌海报标牌logo设计无衬线英文字体安装包 Myfonts – Trakya Sans Font Family
Trakya Sans 是一种具有几何风格的现代无衬线字体。Futura、Avant Garde 等。它具有现代条纹,这是宽度和高度协调的结果,尤其是在小写字母中,以支持易读性。 非常适合广告和包装、编辑和出版、徽标、品牌和创意产业、海报和广告牌、小文本、寻…...
C语言深度解析:从零到系统级开发的完整指南
一、C语言的核心特性与优势 1. 高效性与直接硬件控制 C语言通过编译为机器码的特性,成为系统级开发的首选语言。例如,Linux内核通过C语言直接操作内存和硬件寄存器,实现高效进程调度。 关键点: malloc/free直接管理内存&#…...
ctfshow WEB web8
首先确定注入点,输入以下payload使SQL恒成立 ?id-1/**/or/**/true 再输入一下payload 使SQL恒不成立 ?id-1/**/or/**/false 由于SQL恒不成立, 数据库查询不到任何数据, 从而导致页面空显示 由以上返回结果可知,该页面存在SQL注入,注入点…...
【Linux】U-Boot 加载并启动 Linux 系统程序
U-Boot 加载并启动 Linux 系统程序 零、介绍 最近在玩一些嵌入式的开发板,在引导操作系统时需要用到U-Boot,故此研究一下。 U-Boot(Universal Bootloader)是一款开源的通用引导加载程序,专为嵌入式系统设计ÿ…...
jarvisoj API调用 [JSON格式变XXE]
http://web.jarvisoj.com:9882/ 题目要求:请设法获得目标机器 /home/ctf/flag.txt 中的flag值 抓包得到: POST /api/v1.0/try HTTP/1.1 Host: web.jarvisoj.com:9882 Content-Length: 36 Accept-Language: zh-CN,zh;q0.9 User-Agent: Mozilla/5.0 (W…...
Spring学习笔记07——SpringBoot常用注解记录
一、Lombok 注解 Data:生成所有字段的 getter/setter、toString()、equals() 和 hashCode()。 Getter / Setter:单独为所有字段或指定字段生成 getter/setter。 import lombok.Data;Data public class User {private Long id;private String name; }编…...
深入解析最大公约数(GCD)与最小公倍数(LCM)的C++实现
深入解析最大公约数(GCD)与最小公倍数(LCM)的C实现 一、GCD与LCM的数学定义 1. 最大公约数(GCD) 两个或多个整数共有约数中最大的一个。 例如: GCD(12, 18) 6GCD(21, 14) 7 2. 最小公倍数…...
[Python] 贪心算法简单版
贪心算法-简单版 贪心算法的一般使用场景是给定一个列表ls, 让你在使用最少的数据的情况下达到或超过n. 我们就来使用上面讲到的这个朴素的例题来讲讲贪心算法的基本模板: 2-1.排序 既然要用最少的数据, 我们就要优先用大的数据拼, 为了实现这个效果, 我们得先给列表从大到小…...
机器学习的一百个概念(4)下采样
前言 本文隶属于专栏《机器学习的一百个概念》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…...
NNI 适配 TensorRT10教程
引言 本文涉及两个框架及其版本分别为 NNI (Neural Network Intelligence) :3.0TensorRT:10.9.0.34 NNI 在文档 Speed Up Quantized Model with TensorRT里描述了如何使用 TensorRT 为NNI量化的模型实现加速,但是从NNI 的源代码https://gi…...
Docker, Docker 镜像是什么,怎么创建, Docker有什么用
Docker, Docker 镜像是什么,怎么创建, Docker有什么用 Docker 镜像的概念 Docker 镜像可以理解为一个只读的模板,它包含了运行应用程序所需的所有文件、依赖项、环境变量和配置信息等。就像制作蛋糕的模具,利用这个模具可以制作出多个相同的蛋糕(这里的蛋糕就好比 Dock…...
多路径 TCP 调度的另一面
参考前面的文章 一个原教旨的多路径 TCP 和 MP-BBR 公平性推演,一直都破而不立,不能光说怎样不好,还得说说现状情况下,该如何是好。 如果 receiver 乱序重排的能力有限(拜 TCP 所赐),如果非要在多路径上传输 TCP&…...


















