在matplotlib中,如何在图的两侧显示坐标轴?

26 投票
4 回答
62231 浏览
提问于 2025-04-16 23:12

我想用matplotlib画一个图,图的两边都有坐标轴,像这个图一样(颜色和这个问题无关):

plot

我该怎么用matplotlib来实现这个呢?

注意:和示例图不同,我希望两个坐标轴完全一样,只显示一条图线。加上两个坐标轴只是为了让看图更方便。

4 个回答

2

我之前用下面的方法做过这个:

# Create figure and initial axis    
fig, ax0 = plt.subplots()
# Create a duplicate of the original xaxis, giving you an additional axis object
ax1 = ax.twinx()
# Set the limits of the new axis from the original axis limits
ax1.set_ylim(ax0.get_ylim())

这样做会完全复制原来的y轴。

比如:

ax = plt.gca()

plt.bar(range(3), range(1, 4))
plt.axhline(1.75, color="gray", ls=":")

twin_ax = ax.twinx()
twin_ax.set_yticks([1.75])
twin_ax.set_ylim(ax.get_ylim())

这里输入图片描述

76

你可以使用 tick_params() 这个函数(我是在 Jupyter 笔记本里做的):

import matplotlib.pyplot as plt

bar(range(10), range(10))
tick_params(labeltop=True, labelright=True)

生成了这个图像:

条形图,x轴和y轴的标签相同

更新: 添加了一个简单的子图示例。你应该在轴对象上使用 tick_params()

这段代码设置了只在上面的子图显示顶部标签,而在下面的子图显示底部标签(以及相应的刻度):

import matplotlib.pyplot as plt

f, axarr = plt.subplots(2)

axarr[0].bar(range(10), range(10))
axarr[0].tick_params(labelbottom=False, labeltop=True, labelleft=False, labelright=False,
                     bottom=False, top=True, left=False, right=False)

axarr[1].bar(range(10), range(10, 0, -1))
axarr[1].tick_params(labelbottom=True, labeltop=False, labelleft=False, labelright=False,
                     bottom=True, top=False, left=False, right=False)

看起来像这样:

子图刻度配置示例

21

在线文档中有几个相关的例子:

撰写回答