首页 > 编程笔记 > Python笔记 阅读:62

Matplotlib坐标轴设置方法大全(附带实例)

在组成图表的所有元素中,坐标轴是最重要的元素之一,它为绘制到图表中的数据提供了分类和数值信息。每个坐标系都有两个或更多个坐标轴,本节只讨论两个坐标轴的情况。

创建图表时,Matplotlib 会为每个坐标轴指定默认的刻度范围,并添加刻度线和刻度标签。根据实际需求,可以随时更改这些设置。此外,为了使坐标轴的含义更清晰,通常需要为坐标轴添加标题。

Matplotlib设置坐标轴标题

为了使坐标轴的含义更清晰,通常需要为坐标轴添加标题。使用 pyplot 模块中的 xlabel() 和 ylabel() 函数,或使用 Axes 对象的 set_xlabel() 和 set_ylabel() 方法,可以为 x 轴和 y 轴添加标题。

分析下面的代码:
import matplotlib.pyplot as plt
import numpy as np

x = range(1, 13)
np.random.seed(10)
y = np.random.randint(10, 100, 12)
fig, ax = plt.subplots()
ax.plot(x, y)
plt.show()
将创建下图所示的图表,由于 x 轴和 y 轴都没有标题,所以不知道两个坐标轴的数据表示的是什么。


图 1 没有标题的坐标轴

本例使用 numpy 库中的 randint() 函数自动生成 10~100 的随机整数,所以需要在代码的开头导入该库。np.random.seed(10) 这条语句是为了每次运行代码时,都能生成完全相同的随机数。可以将括号中的 10 替换为任意数字,使用同一个数字可以获得相同的随机数。

下面的代码是使用 Axes 对象的 set_xlabel() 方法,将 x 轴的标题设置为“月份”,使用 set_ylabel() 方法将 y 轴的标题设置为“数量”:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

mpl.rcParams['font.sans-serif'] = 'SimSun'  # 设置字体为SimSun
x = range(1, 13)
np.random.seed(10)
y = np.random.randint(10, 100, 12)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlabel('月份')  # 设置x轴标签为“月份”
ax.set_ylabel('数量')  # 设置y轴标签为“数量”
plt.show()
此时坐标轴的含义变得非常明确,如下图所示:


图 2 为坐标轴添加标题

使用 pyplot 模块中的 xlabel() 和 ylabel() 函数也可以实现相同的功能:
plt.xlabel('月份')
plt.ylabel('数量')
x 轴和 y 轴的标题默认显示在图表的底部和左侧。使用 Axis 对象的 set_label_position() 方法可以更改标题的位置。为了获得对 x 轴和 y 轴的引用,需要使用 Axes 对象的 xaxis 和 yaxis 属性。

下面的代码将 x 轴标题显示在图表的顶部,将 y 轴标题显示在图表的右侧:
ax.xaxis.set_label_position('top')
ax.yaxis.set_label_position('right')
如下图所示:


图 3 更改坐标轴标题的位置

将 set_label_position() 方法的参数分别设置为 bottom 和 left,可以将 x 轴和 y 轴的标题显示到图表的底部和左侧。

Matplotlib设置坐标轴取值范围

在 Matplotlib 中,创建坐标系的 x 轴和 y 轴的取值范围默认为 0~1。创建图表时,Matplotlib 会根据数据中的最小值和最大值,自动调整坐标轴的取值范围。

为了使数据在图表上呈现更好的效果,有时可能需要手动更改坐标轴的取值范围。如需更改坐标轴的取值范围,可以使用 pyplot 模块中的 xlim() 和 ylim() 函数,或使用 Axes 对象的 set_xlim() 和 set_ylim() 方法。

下面的代码是使用 xlim() 函数将 x 轴的取值范围设置为 1~6,使用 ylim() 函数将 y 轴的取值范围设置为 10~100:
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.xlim(1, 6)
plt.ylim(10, 100)
plt.show()
如下图所示:


图 4 设置坐标轴的取值范围

下面的代码实现相同的功能,但是使用的是 Axes 对象的 set_xlim() 和 set_ylim() 方法:
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
ax.set_xlim(1, 6)
ax.set_ylim(10, 100)
plt.show()

Matplotlib设置坐标轴刻度和标签

在 Matplotlib 中,有时创建的图表中的坐标轴刻度不是连续的,比如 x 轴的刻度是 2、4、6、8、10 和 12,y轴也可能是类似的情况。

如果希望 x 轴的刻度按照 1、2、3、4、5 等连续数字的方式显示,则需要更改坐标轴的刻度。使用 pyplot 模块中的 xticks() 函数和 yticks() 函数,或 Axis 对象的 set_ticks() 方法,可以更改坐标轴的刻度。

下面的代码是使用 xticks() 函数和 yticks() 函数分别将 x 轴和 y 轴的刻度细化显示:
import matplotlib.pyplot as plt
import numpy as np

x = range(1, 13)
np.random.seed(10)
y = np.random.randint(10, 100, 12)
fig, ax = plt.subplots()
ax.plot(x, y)
plt.xticks(x)  # 设置x轴的刻度标签为x的值
plt.yticks(range(10, 101, 10))  # 设置y轴的刻度标签为10到100,步长为10的值
plt.show()
如下图所示:


图 5 设置坐标轴的刻度

使用 Axis 对象的 set_ticks() 方法可以实现相同的功能,但是需要先使用 Axes 对象的 xaxis 属性和 yaxis 属性分别引用 x 轴和 y 轴,然后再使用 set_ticks() 方法设置 x 轴和 y 轴的刻度。
ax.xaxis.set_ticks(x)
ax.yaxis.set_ticks(range(10, 101, 10))

无论是 xticks() 函数和 yticks() 函数,还是 set_ticks() 方法,上面的示例都只为它们指定了第一个参数。它们还有一个关键字参数 labels,用于设置刻度的标签,即显示在刻度旁边的数字或文字。

下面的代码将 x 轴的刻度标签设置为 1 月、2 月、3 月……12 月的形式:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

mpl.rcParams['font.sans-serif'] = 'SimSun'  # 设置字体为SimSun,以支持中文显示
x = range(1, 13)
date = []
for d in x:
    date.append(str(d) + '月')
np.random.seed(10)
y = np.random.randint(10, 100, 12)
fig, ax = plt.subplots()
ax.plot(x, y)
ax.xaxis.set_ticks(x, date)  # 设置x轴的刻度标签为日期
ax.yaxis.set_ticks(range(10, 101, 10))  # 设置y轴的刻度标签为10到100,步长为10的值
plt.show()
如下图所示:


图 6 设置坐标轴的刻度标签

如果想要减少代码的行数,可以使用列表推导式代替 for 循环语句,修改后的代码如下:
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

mpl.rcParams['font.sans-serif'] = 'SimSun'  # 设置字体为SimSun以支持中文显示
x = range(1, 13)
date = [str(d) + '月' for d in x]  # 使用列表推导式生成日期标签
np.random.seed(10)  # 设置随机数种子以确保结果可复现
y = np.random.randint(10, 100, 12)  # 生成12个10到100之间的随机整数
fig, ax = plt.subplots()  # 创建图形和轴
ax.plot(x, y)  # 绘制折线图
ax.xaxis.set_ticks(x, date)  # 设置x轴的刻度标签为日期
ax.yaxis.set_ticks(range(10, 101, 10))  # 设置y轴的刻度标签为10到100,步长为10
plt.show()  # 显示图形

相关文章