Matplotlib的绘图构成¶
组成部分¶
Matplotlib是一个Python绘图库,提供了丰富的绘图功能,可以用于创建各种类型的图表,包括线图、散点图、柱状图、饼图、雷达图等。一个Matplotlib的绘图通常由以下几个主要组成部分构成:
Figure(画布):画布是绘图的最外层容器,可以包含一个或多个子图(Axes)。在画布上可以设置绘图的尺寸、分辨率等属性。
Axes(子图):子图是画布上的一个绘图区域,用于绘制具体的图表内容。一个画布可以包含多个子图,每个子图可以包含多个坐标系。
Axis(坐标系):坐标系是子图中的坐标轴,用于显示数据范围和刻度。坐标系可以分为X轴和Y轴,用于显示水平和垂直方向的数据。
Labels(标签):标签用于标识图表的标题、坐标轴标签、数据点标签等,帮助解释和理解图表内容。
Legend(图例):图例是用于解释图表中各种元素含义的标识,通常与图表内容相关联并放置在适当位置。
Tick(刻度):刻度是坐标轴上的标记,用于表示数据范围和划分坐标轴。刻度包括主刻度和次刻度,可以通过设置刻度位置和标签来调整坐标轴的显示。
TickLabel(刻度标签):刻度标签是与刻度对应的文字标签,用于标识刻度所代表的具体数值或类别。
AxisLabel(坐标轴标签):坐标轴标签是用于描述坐标轴所表示含义的文字标签,通常包括X轴和Y轴的标签。
Title(标题):标题是图表的主要标题,用于描述图表内容或主题。
Line2D(线条):Line2D是Matplotlib中表示线条的对象,可以用于绘制折线图、曲线图等。
Rectangle(矩形):Rectangle是Matplotlib中表示矩形的对象,可用于绘制柱状图、框图等。
Marker(数据点标记):Marker是用于标记数据点位置的符号,可以通过设置不同的形状和颜色来区分不同数据点。
Artist(图形元素):Artist是Matplotlib中所有可见元素的基类,包括Line2D、Rectangle、Text等,用于构建图表中的各种图形元素。
这些组成部分共同构成了一个完整的Matplotlib图表,通过合理设置和调整这些组成部分,可以创建出具有信息丰富和美观效果的图表。
添加axes对象的方法¶
使用plt.subplots()函数创建画布和子图¶
import matplotlib.pyplot as plt
import numpy as np
# 设置中文显示字体
plt.rcParams['font.sans-serif'] = ['PingFang HK']
plt.figure(figsize=(15,8))
# 创建画布和子图
fig, ax = plt.subplots()
# 在子图中绘制图表内容
ax.plot(np.random.rand(10))
# 设置坐标轴标签和标题
ax.set_xlabel('X轴标签')
ax.set_ylabel('Y轴标签')
ax.set_title('图表标题')
plt.show()
<Figure size 1500x800 with 0 Axes>
使用add_subplot():¶
import matplotlib.pyplot as plt
# 创建画布
fig = plt.figure()
# 添加子图
ax = fig.add_subplot(111)
# 在子图中绘制图表内容
ax.plot(np.random.rand(10))
# 设置坐标轴标签和标题
ax.set_xlabel('X轴标签')
ax.set_ylabel('Y轴标签')
ax.set_title('图表标题')
plt.show()
总结¶
- 图的构成:Figure是一个画板,上面可以有很多的axes对象,每个axes对象有轴(axis)、有线条、有Legend、有title等
- Figure上的相关操作,基本都是对Axes的操作:
- 添加axes:有两种方法可以添加,分别是add_subplot或者subplots
Axes容器¶
Axes的常用方法¶
函数名称 | 作用 | 函数名称 | 参数 |
---|---|---|---|
plot() | 绘制折线图 | plot() |
x : X轴数据y : Y轴数据fmt : 线条格式,如颜色、线型等 |
scatter() | 绘制散点图 | scatter() |
x : X轴数据y : Y轴数据s : 散点大小c : 散点颜色 |
bar() | 绘制柱状图 | bar() |
x : 柱的位置height : 柱的高度width : 柱的宽度 |
pie() | 绘制饼图 | pie() |
x : 饼图数据labels : 饼图标签 |
boxplot() | 绘制箱线图 | boxplot() |
data : 箱线图数据notch : 是否显示缺口 |
set_xlabel() | 设置X轴标签 | set_xlabel() |
xlabel : X轴标签文本 |
set_ylabel() | 设置Y轴标签 | set_ylabel() |
ylabel : Y轴标签文本 |
set_title() | 设置图表标题 | set_title() |
label : 图表标题文本 |
annotate() | 添加注释 | annotate() |
text : 注释文本xy : 注释位置xytext : 文本位置 |
set_xlim() | 设置X轴范围 | set_xlim() |
left : X轴最小值right : X轴最大值 |
set_ylim() | 设置Y轴范围 | set_ylim() |
bottom : Y轴最小值top : Y轴最大值 |
设置X轴和Y轴的最大值、最小值¶
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 18, 16]
# 创建画布和子图
fig, ax = plt.subplots()
# 绘制折线图
ax.plot(x, y)
# 设置X轴和Y轴的最大值和最小值
ax.set_xlim(0, 6) # 设置X轴范围为0到6
ax.set_ylim(0, 20) # 设置Y轴范围为0到20
# 设置X轴和Y轴标签
ax.set_xlabel('X轴标签')
ax.set_ylabel('Y轴标签')
# 设置图表标题
ax.set_title('示例图表')
plt.show()
添加文本¶
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 18, 16]
# 创建画布和子图
fig, ax = plt.subplots()
# 绘制折线图
ax.plot(x, y)
# 添加文本注释
ax.text(3, 14, '这是一个文本', fontsize=12, color='red', ha='center', va='center', bbox=dict(facecolor='yellow', alpha=0.5))
# 设置X轴和Y轴标签
ax.set_xlabel('X轴标签')
ax.set_ylabel('Y轴标签')
# 设置图表标题
ax.set_title('示例图表')
plt.show()
添加注释¶
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y = [10, 15, 13, 18, 16]
# 创建画布和子图
fig, ax = plt.subplots()
# 绘制折线图
ax.plot(x, y)
# 添加注释
ax.annotate('最高点', xy=(4, 18), xytext=(4.5, 19),
arrowprops=dict(facecolor='black', shrink=0.05))
# 设置X轴和Y轴标签
ax.set_xlabel('X轴标签')
ax.set_ylabel('Y轴标签')
# 设置图表标题
ax.set_title('示例图表')
plt.show()
绘制双Y轴¶
import matplotlib.pyplot as plt
# 创建数据
x = [1, 2, 3, 4, 5]
y1 = [10, 15, 13, 18, 16]
y2 = [20, 18, 25, 20, 22]
# 创建画布和子图
fig, ax1 = plt.subplots()
# 绘制柱状图
ax1.bar(x, y1, color='b', label='降水量')
ax1.set_xlabel('时间')
ax1.set_ylabel('Y1轴', color='b')
# 创建第二个Y轴
ax2 = ax1.twinx() # 克隆一个共享X轴的axes对象
ax2.plot(x, y2, 'r-', marker='o', label='温度')
ax2.set_ylabel('Y2轴', color='r')
# 添加图例
lines, labels = ax1.get_legend_handles_labels()
lines2, labels2 = ax2.get_legend_handles_labels()
ax2.legend(lines + lines2, labels + labels2, loc='upper right')
# 设置图表标题
plt.title('双Y轴示例')
plt.show()
总结:¶
1、双Y轴原理是两个Axes对象堆叠在一起,先创建一个Axes对象,然后通过.twinx()克隆一个新的Axes对象。
方法名称 | 作用 |
---|---|
set_label_text() | 设置轴的标签文本 |
set_ticks() | 设置轴的刻度位置 |
set_ticklabels() | 设置刻度标签文本 |
set_tick_params() | 设置刻度线和刻度标签的参数 |
set_scale() | 设置轴的比例尺 |
set_limits() | 设置轴的范围 |
set_major_locator() | 设置主刻度定位器 |
set_minor_locator() | 设置次刻度定位器 |
set_major_formatter() | 设置主刻度格式化器 |
set_minor_formatter() | 设置次刻度格式化器 |
invert_axis() | 反转轴方向 |
set_visible() | 设置轴的可见性 |
set_label_position() | 设置轴标签的位置 |
设置X轴和Y轴Label的位置¶
import matplotlib.pyplot as plt
# 创建数据:月份和销售额
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May']
sales = [10000, 12000, 11000, 13000, 12500]
# 创建画布和子图
fig, ax = plt.subplots()
# 绘制柱状图
ax.bar(months, sales, color='skyblue')
# 将X轴标签设置在右侧并旋转了45度
ax.set_xlabel('Month', loc='right', rotation=45)
# 将Y轴标签设置在顶部并旋转了90度
ax.set_ylabel('Sales ($)', loc='top', rotation=90)
# 设置图表标题
ax.set_title('Monthly Sales Performance')
plt.show()
设置刻度上的刻度格式¶
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
from matplotlib.ticker import FuncFormatter
# 创建日期数据
dates = pd.date_range('2023-01-01', periods=5, freq='M')
values = [10000, 12000, 11000, 13000, 12500]
# 设置中文显示字体
plt.rcParams['font.sans-serif'] = ['PingFang HK']
# 创建画布和子图,设置子图的宽度和高度
fig, ax = plt.subplots(figsize=(12, 10))
# 绘制折线图
ax.plot(dates, values, marker='o')
# 设置X轴日期刻度格式为月份和年份
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
# 设置Y轴刻度格式为美元符号和逗号表示方式
def dollar_format(x, pos):
return '${:,.0f}'.format(x)
ax.yaxis.set_major_formatter(FuncFormatter(dollar_format))
# 设置X轴和Y轴标签
ax.set_xlabel('Date')
ax.set_ylabel('Sales')
# 设置图表标题
ax.set_title('Monthly Sales Data')
plt.show()
Y轴及刻度设置在右侧显示¶
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
from matplotlib.ticker import FuncFormatter
# 创建日期数据
dates = pd.date_range('2023-01-01', periods=5, freq='M')
values = [10000, 12000, 11000, 13000, 12500]
# 设置中文显示字体
plt.rcParams['font.sans-serif'] = ['PingFang HK']
# 创建画布和子图,设置子图的宽度和高度
fig, ax = plt.subplots(figsize=(14, 10))
# 绘制折线图
ax.plot(dates, values, marker='o')
# 设置X轴日期刻度格式为月份和年份
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %Y'))
# 设置Y轴标签在右侧显示
ax.yaxis.set_label_position('right')
# 设置Y轴刻度格式为美元符号和逗号表示方式
def dollar_format(x, pos):
return '${:,.0f}'.format(x)
ax.yaxis.set_major_formatter(FuncFormatter(dollar_format))
# 设置Y轴刻度标签在右侧显示
ax.yaxis.tick_right()
# 设置X轴和Y轴标签
ax.set_xlabel('Date')
ax.set_ylabel('Sales ($)', rotation=0, labelpad=20)
# 设置图表标题
ax.set_title('Monthly Sales Data')
plt.show()