◾ 编程语言:.NET/Java/Python/Go/Node...
◾ 移动生态:HarmonyOS/iOS/Android/小程序
◾ 前沿领域:物联网/网络安全/大数据/AI/元宇宙
◾ 游戏开发:Unity3D引擎深度解析
在数据可视化的过程中,图表的美观与易读性直接影响到数据传达的效果。Matplotlib作为Python中最流行的绘图库之一,提供了丰富的功能和灵活的设置选项,使得我们能够创建出专业且具有视觉冲击力的图表。然而,初学者常常会在图表设置上感到困惑,不知道如何调整图表的样式、颜色、标签及其他参数,以达到最佳的可视化效果。
在本篇文章《Matplotlib 图表的常用设置》中,我们将系统地介绍Matplotlib中常用的图表设置技巧。我们将涵盖图表的基本构建块,包括标题、坐标轴、图例、刻度以及颜色等方面的设置。通过具体的实例和代码示例,你将学会如何调整图表的各个细节,使其不仅能够有效传达信息,还能吸引观众的注意力。
plot()
语法
matplotlib.pyplot.plot(x, y, format_string, **kwargs)
参数说明
参数 | 说明 |
---|---|
| x轴数据(列表/数组) |
| y轴数据(列表/数组) |
| 控制曲线格式的字符串(颜色+线条+标记,如 |
| 键值参数(如 |
示例
import matplotlib.pyplot as plt
#折线图
#range()函数创建整数列表
x=range(1,15,1)
y=range(1,42,3)
plt.plot(x,y)
plt.show()
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_excel('体温.xls') #导入Excel文件
#折线图
x =df['日期'] #x轴数据
y=df['体温'] #y轴数据
plt.plot(x,y)
plt.show()
颜色参数 color
支持多种颜色表示方式:
代码 | 颜色 | 其他方式示例 |
---|---|---|
| 蓝色 |
|
| 绿色 |
|
| 红色 |
|
| 蓝绿色 |
|
| 洋红色 |
|
| 黄色 |
|
颜色循环设置
from cycler import cycler
colors = ['#1f77b4', '#ff7f0e', '#2ca02c']
plt.rcParams['axes.prop_cycle'] = cycler(color=colors)
linestyle
代码 | 样式 | 示例 |
---|---|---|
| 实线(默认) | undefined |
| 虚线 | undefined |
| 点线 | undefined |
| 点划线 | undefined |
marker
代码 | 样式 | 说明 |
---|---|---|
| 圆圈 | 实心圆标记 |
| 正方形 | 实心正方形 |
| 上三角形 | 倒三角标记 |
| 菱形 | 大菱形标记 |
| 星号 | 五角星标记 |
| 六边形 | 竖六边形标记 |
标记修饰参数
markerfacecolor
(mfc): 标记填充色(如 mfc='w'
白色填充)markeredgecolor
(mec): 标记边缘颜色markersize
(ms): 标记大小绘制体温折线图
import pandas as pd
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(5,3),facecolor='yellow')
#导入Excel文件
df=pd.read_excel('体温.xls')
#折线图
x=df['日期'] #x轴数据
y=df['体温'] #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.show()
坐标轴与标题
plt.xlabel("x轴标签")
:设置x轴标签plt.ylabel("y轴标签")
:设置y轴标签plt.title("图表标题")
:设置标题图例与注释
plt.legend(["图例说明"])
:添加图例plt.text(x, y, "注释文本")
:在指定坐标添加文本plt.annotate("注释", xy=(x,y), xytext=(x1,y1), arrowprops=dict(arrowstyle="->"))
调整边距
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)
# 或自动调整
plt.tight_layout()
体温.xls
在代码同级目录)。#FFFF00
(黄色)而非 #FFFFOO
。plt.style
选择预置主题(如 plt.style.use('ggplot')
)。figure()
函数语法与参数figure()
函数用于创建或激活画布,语法如下:
matplotlib.pyplot.figure(
num=None, # 画布编号或名称
figsize=None, # 画布尺寸
dpi=None, # 分辨率
facecolor=None, # 背景颜色
edgecolor=None, # 边框颜色
frameon=True # 是否显示边框
)
参数 | 类型 | 说明 | 默认值 | 示例 |
---|---|---|---|---|
|
| 画布标识符(编号或名称)。若 |
|
|
|
| 画布尺寸 |
|
|
|
| 分辨率(每英寸像素数),值越大图像越清晰。 |
|
|
|
| 背景颜色(支持名称、十六进制、RGB元组等)。 |
|
|
|
| 边框颜色。 |
|
|
|
| 是否显示边框。 |
|
|
自定义黄色画布(尺寸 5x3 英寸)
import pandas as pd
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(5,3),facecolor='yellow')
#导入Excel文件
df=pd.read_excel('体温.xls')
#折线图
x=df['日期'] #x轴数据
y=df['体温'] #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.show()
体温.xls
存在于代码同级目录,或使用绝对路径(如 r'C:\data\体温.xls'
)。pandas
是否安装:pip install pandas openpyxl
(需 openpyxl
支持 .xls
)。facecolor
和 edgecolor
支持多种格式:颜色名称('red'
)、十六进制('#FF0000'
)、RGB 元组((1,0,0)
)。plt.figure()
创建独立画布后,默认在当前画布上绘制图形。plt.subplots()
使用。dpi
值(如 dpi=300
)适合保存高清图像,但可能增加内存消耗。plt.show()
可能不会按 figsize
精确显示,建议导出为图片查看实际尺寸。frameon=False
会隐藏画布边框,但坐标轴仍保留。num
参数可激活已存在的画布:plt.figure(num='my_plot') # 激活名为 'my_plot' 的画布函数说明
xlabel()
:设置x轴标题ylabel()
:设置y轴标题示例代码
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls') #导入Excel文件
#折线图
x=df['日期'] #x轴数据
y=df['体温'] #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月') #x轴标题
plt.ylabel('基础体温') #y轴标题
plt.show()
函数说明
locs
:刻度位置(数组)labels
:刻度标签(数组,与locs
长度一致)示例代码
(1) 设置x轴为1~14的连续刻度
plt.xticks(range(1, 15, 1)) # 刻度位置:1到14,步长1
(2) 自定义x轴标签(带“日”的日期)
dates = ['1日', '2日', '3日', '4日', '5日', '6日', '7日',
'8日', '9日', '10日', '11日', '12日', '13日', '14日']
plt.xticks(range(1, 15, 1), dates) # 刻度位置与标签一一对应
(3) 设置y轴体温刻度(35.4~38,间隔0.2)
plt.yticks([35.4, 35.6, 35.8, 36, 36.2, 36.4, 36.6,
36.8, 37, 37.2, 37.4, 37.6, 37.8, 38])
完整代码:
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls') #导入Excel文件
#折线图
x=df['日期'] #x轴数据
y=df['体温'] #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月') #x轴标题
plt.ylabel('基础体温') #y轴标题
plt.xticks(range(1,15,1))
# dates=['1日','2日','3日','4日','5日',
# '6日','7日','8日','9日','10日',
# '11日','12日','13日','14日']
# plt.xticks(range(1,15,1),dates)
plt.show()
函数说明
xlim(left, right)
:设置x轴范围ylim(bottom, top)
:设置y轴范围示例代码
plt.xlim(1, 14) # x轴范围:1~14
plt.ylim(35, 38) # y轴范围:35~38(更合理的体温区间)
函数说明
color
:网格线颜色(支持颜色名称、十六进制等)linestyle
:线型(如 '-'
, '--'
, ':'
)linewidth
:线宽(数值)axis
:方向('x'
仅x轴,'y'
仅y轴)示例代码
plt.grid(
color='0.7', # 浅灰色(0~1的灰度值)
linestyle='--', # 虚线
linewidth=0.8, # 线宽
alpha=0.5 # 透明度(0~1)
)
(1) 中文乱码问题
# 设置中文字体(需系统支持)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 黑体
# 或使用其他字体(如微软雅黑)
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决负号显示
plt.rcParams['axes.unicode_minus'] = False
(2) 文件路径与依赖
(3) 刻度优化技巧
plt.Locator
类自动生成合理刻度from matplotlib.ticker import MultipleLocator
plt.gca().xaxis.set_major_locator(MultipleLocator(2)) # x轴每隔2单位显示刻度(4) 饼图网格线特殊处理
frame=True
:plt.pie(sizes, labels=labels, autopct='%1.1f%%', frame=True)
plt.grid(True) # 显示网格线import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls') #导入Excel文件
#折线图
x=df['日期'] #x轴数据
y=df['体温'] #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月') #x轴标题
plt.ylabel('基础体温') #y轴标题
dates=['1日','2日','3日','4日','5日',
'6日','7日','8日','9日','10日',
'11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
plt.xlim(1,14)
plt.ylim(35,45)
plt.show()
text()
函数语法与参数语法
matplotlib.pyplot.text(
x, y, # 标签坐标
s, # 文本内容
fontdict=None, # 字体属性字典
withdash=False, # 是否使用虚线文本(已弃用)
**kwargs # 其他文本样式参数
)
参数说明
参数 | 类型 | 说明 | 示例 |
---|---|---|---|
|
| 文本的坐标位置(基于数据范围) |
|
|
| 显示的文本内容 |
|
|
| 自定义字体属性(覆盖默认值) |
|
|
| 其他文本样式参数(如字体大小、对齐方式) |
|
为体温折线图添加数据标签
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls') #导入Excel文件
#折线图
x=df['日期'] #x轴数据
y=df['体温'] #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月') #x轴标题
plt.ylabel('基础体温') #y轴标题
#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
'6日','7日','8日','9日','10日',
'11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
plt.yticks([35.4,35.6,35.8,36,36.2,36.4,36.6,36.8,
37,37.2,37.4,37.6,37.8,38])
for a,b in zip(x,y):
plt.text(a,b+0.05,'%.1f'%b,ha = 'center',va = 'bottom',fontsize=9)
plt.show()
(1) 对齐方式
horizontalalignment
(ha
):水平对齐,可选值:'left'
, 'center'
, 'right'
。verticalalignment
(va
):垂直对齐,可选值:'top'
, 'center'
, 'bottom'
, 'baseline'
。(2) 常用样式参数
参数 | 说明 | 示例 |
---|---|---|
| 字体大小 |
|
| 文本颜色 |
|
| 旋转角度 |
|
| 文本背景框 |
|
(3) 动态调整位置
b + 0.05
将标签上移,避免与数据点重叠。f'{b:.1f}'
或 '%.1f' % b
保留1位小数。pip install pandas openpyxl
。SimHei
不可用,替换为其他中文字体(如 'Microsoft YaHei'
)。rotation
旋转标签。adjustText
库自动调整标签位置:from adjustText import adjust_text
texts = [plt.text(a, b, f'{b:.1f}') for a, b in zip(x, y)]
adjust_text(texts) # 自动调整标签位置标记最高体温点
max_temp = y.max()
max_idx = y.idxmax()
plt.text(
x[max_idx], max_temp + 0.1,
f'最高体温: {max_temp:.1f}℃',
ha='center',
va='bottom',
color='red',
fontweight='bold'
)
函数语法
matplotlib.pyplot.title(
label, # 标题文本
fontdict=None, # 字体样式字典
loc='center', # 标题水平位置
pad=None, # 标题与图表顶部的间距
**kwargs # 其他文本样式参数
)
参数说明
参数 | 类型 | 说明 | 示例 |
---|---|---|---|
|
| 标题文本内容 |
|
|
| 字体属性字典(覆盖默认样式) |
|
|
| 标题水平位置( |
|
|
| 标题与图表顶部的间距(单位:像素) |
|
|
| 其他文本样式(如 |
|
示例代码
plt.title(
'14天基础体温折线图', # 标题内容
fontsize=18, # 字体大小(注意:应为整数,非字符串)
loc='left', # 标题左对齐
color='navy', # 字体颜色
pad=15 # 标题与图表的间距
)
函数语法
matplotlib.pyplot.legend(
labels=None, # 图例标签列表
loc='best', # 图例位置(见表14.3)
bbox_to_anchor=None, # 图例微调坐标(元组)
fontsize=10, # 字体大小
**kwargs # 其他样式参数
)
参数说明
(1) 基本用法
方式 | 代码示例 | 说明 |
---|---|---|
自动显示图例 |
| 自动根据绘图时的 |
手动指定图例 |
| 手动传入标签列表(需与绘图顺序一致) |
(2) 图例位置参数 loc
位置代码 | 描述 | 示例效果 |
---|---|---|
| 自动选择最佳位置 | undefined |
| 右上方 | undefined |
| 左侧中间 | undefined |
| 下方中间 | undefined |
(3) 微调位置 bbox_to_anchor
通过元组 (num1, num2)
调整图例位置:
num1
:左右偏移(值越大越右)num2
:上下偏移(值越大越上)示例:
plt.legend(
['体温'],
loc='upper right',
bbox_to_anchor=(1.2, 1), # 向右上方微调
fontsize=10
)
完整标题与图例设置
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls') #导入Excel文件
#折线图
x=df['日期'] #x轴数据
y=df['体温'] #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月') #x轴标题
plt.ylabel('基础体温') #y轴标题
#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
'6日','7日','8日','9日','10日',
'11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
plt.yticks([35.4,35.6,35.8,36,36.2,36.4,36.6,36.8,
37,37.2,37.4,37.6,37.8,38])
for a,b in zip(x,y):
plt.text(a,b+0.05,'%.1f'%b,ha = 'center',va = 'bottom',fontsize=9)
plt.title('14天基础体温曲线图',fontsize='18')
plt.legend(('体温',),loc='upper right',fontsize=10)
plt.show()
fontsize
应为整数(如 fontsize=18
),而非字符串(避免 fontsize='18'
)。label
参数:plt.plot(x, y, label='体温变化')
plt.legend() # 自动读取labelbbox_to_anchor
调整位置,或扩大画布边距:plt.subplots_adjust(right=0.8) # 右侧留出20%空白label
:plt.plot(x1, y1, label='数据1')
plt.plot(x2, y2, label='数据2')
plt.legend()annotate()
函数语法与核心参数语法
plt.annotate(
text, # 注释文本内容
xy, # 被注释点的坐标(数据坐标系)
xytext=None, # 注释文本的坐标(默认与xy相同)
xycoords='data', # 被注释点的坐标系统
arrowprops=None, # 箭头样式字典
**kwargs # 其他文本样式参数(如字体、颜色)
)
xycoords
)常用坐标系设置
参数值 | 说明 | 示例场景 |
---|---|---|
| 默认值,基于数据坐标 | 注释数据点(如最高体温点) |
| 基于子图区域的百分比(左下角为(0,0),右上角为(1,1)) | 在图表左上角添加注释 |
| 基于整个画布的像素点(左下角为(0,0)) | 精确控制注释在画布中的位置 |
| 极坐标系(需配合极坐标图使用) | 雷达图或极坐标图的注释 |
示例
# 在数据点 (9, 37.1) 处添加注释,文本位于数据点右侧
plt.annotate('最高体温', xy=(9, 37.1), xycoords='data', xytext=(10.5, 37.1))
arrowprops
)常用参数
参数 | 类型 | 说明 | 示例 |
---|---|---|---|
|
| 箭头样式(如 |
|
|
| 箭头颜色 |
|
|
| 箭头两端收缩比例(0~1) |
|
|
| 箭头杆宽度(单位:点) |
|
|
| 箭头头部宽度(点) |
|
|
| 箭头头部长度(点) |
|
示例
arrowprops = dict(
arrowstyle='->', # 简单箭头样式
facecolor='red', # 箭头颜色
shrink=0.05, # 箭头两端收缩5%
linewidth=1.5, # 箭头线宽
edgecolor='black' # 箭头边缘颜色
)
标注最高体温点
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #解决中文乱码
df=pd.read_excel('体温.xls') #导入Excel文件
#折线图
x=df['日期'] #x轴数据
y=df['体温'] #y轴数据
plt.plot(x,y,color='m',linestyle='-',marker='o',mfc='w')
plt.xlabel('2020年2月') #x轴标题
plt.ylabel('基础体温') #y轴标题
#设置x轴刻度及标签
dates=['1日','2日','3日','4日','5日',
'6日','7日','8日','9日','10日',
'11日','12日','13日','14日']
plt.xticks(range(1,15,1),dates)
plt.yticks([35.4,35.6,35.8,36,36.2,36.4,36.6,36.8,
37,37.2,37.4,37.6,37.8,38])
for a,b in zip(x,y):
plt.text(a,b+0.05,'%.1f'%b,ha = 'center',va = 'bottom',fontsize=9)
plt.title('14天基础体温曲线图',fontsize='18')
plt.legend(('体温',),loc='upper right',fontsize=10)
plt.annotate('最高体温', xy=(9,37.1), xytext=(10.5,37.1),
xycoords='data',
arrowprops=dict(facecolor='r', shrink=0.05))
plt.show()
(1) 多注释场景
# 标注最低体温点
min_temp = y.min()
min_idx = y.idxmin()
plt.annotate(
'最低体温',
xy=(x[min_idx], min_temp),
xytext=(x[min_idx] - 2, min_temp - 0.2),
arrowprops=dict(arrowstyle='wedge', color='blue')
)
(2) 高级箭头样式
使用 FancyArrowPatch
自定义箭头:
from matplotlib.patches import FancyArrowPatch
plt.annotate(
'异常值',
xy=(5, 36.8),
xytext=(3, 37.5),
arrowprops=dict(
arrowstyle='fancy',
connectionstyle='arc3,rad=0.3', # 弧形箭头
color='orange',
mutation_scale=20 # 控制箭头大小
)
)
(3) 注意事项
xy
和 xytext
使用相同坐标系(默认为 'data'
)。xytext
或使用 textcoords
参数指定文本坐标系:plt.annotate(
'注释',
xy=(0.5, 0.5),
xycoords='axes fraction', # 被注释点在子图中心
xytext=(0.7, 0.7), # 文本在子图的(70%,70%)位置
textcoords='axes fraction' # 文本使用子图百分比坐标系
)projection='polar'
),需设置 xycoords='polar'
。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。