繁体   English   中英

matplotlib中的轴尺寸如何调整?

[英]How to adjust the axis size in matplotlib?

我的目标是创建一个带有日期的分层 x 轴。 为此,我正在按照此答案的步骤进行操作。 我在第一个 x 轴上有一天:

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.ticker as ticker

date = ['2021-01-29', '2021-01-30', '2021-01-31',
        '2021-02-01', '2021-02-02', '2021-01-03', '2021-01-04']
day = ['29', '30', '31', '01', '02', '03', '04']
data = [5, 4, 3, 9, 7, 8, 2]

fig = plt.figure(num="TEST")
ax1 = fig.add_subplot(1, 1, 1)

ax1.plot(date, data)

ax1.set_xticks(date)
ax1.set_xticklabels(day)
ax1.margins(x=0)

plt.show()

使用以下代码块,我在第二个 x 轴上生成月份:

ax2 = ax1.twiny()

ax2.spines['bottom'].set_position(('axes', -0.08))
ax2.tick_params('both', direction='in', which='major')
ax2.xaxis.set_ticks_position('bottom')
ax2.xaxis.set_label_position('bottom')

ax2.set_xticks([0, 2.5, 6])
ax2.xaxis.set_major_formatter(ticker.NullFormatter())
ax2.xaxis.set_minor_locator(ticker.FixedLocator([1, 4]))
ax2.xaxis.set_minor_formatter(ticker.FixedFormatter(['JAN', 'FEB']))

这在 plot 线上完美运行:

在此处输入图像描述

但是,当我将图表类型更改为 bar ax1.bar(date, data)时,两个轴的开始和结束刻度不匹配:

在此处输入图像描述

有没有办法让两个轴在同一点开始和结束? 一直延伸第一个轴(无论重叠)或调整第二个轴以匹配第一个轴。

为了使两个 x 轴很好地对齐,它们具有相同的数据限制 ( ax2.set_xlim(ax1.get_xlim()) ) 很重要。 然后, ax2.set_xticks([0, 2.5, 6])将在第一个和最后一个柱的中心以及第三个和第四个之间有刻度。

您可以使用ax2.spines['bottom'].set_bounds([0, 6])在这些位置停止 x 轴。

如果您还想隐藏ax1的刻度线,标准方法是将它们的长度设置为零: ax1.tick_params(axis='x', length=0)

如果需要,您还可以隐藏顶部和右侧的脊椎。 您需要对两个轴都这样做。

from matplotlib import pyplot as plt
import matplotlib.ticker as ticker

date = ['2021-01-29', '2021-01-30', '2021-01-31',
        '2021-02-01', '2021-02-02', '2021-01-03', '2021-01-04']
day = ['29', '30', '31', '01', '02', '03', '04']
data = [5, 4, 3, 9, 7, 8, 2]

fig, ax1 = plt.subplots(num="TEST")

ax1.bar(date, data)

ax1.set_xticks(np.arange(len(date)))
ax1.set_xticklabels(day)
ax1.margins(x=0)
ax1.tick_params(axis='x', length=0)  # hide tick marks

ax2 = ax1.twiny()

ax2.spines['bottom'].set_position(('axes', -0.08))
ax2.tick_params(axis='x', direction='in', which='major')
ax2.xaxis.set_ticks_position('bottom')
ax2.xaxis.set_label_position('bottom')

ax2.set_xlim(ax1.get_xlim()) # same datalimits
ax2.set_xticks([0, 2.5, 6])
ax2.spines['bottom'].set_bounds([0, 6])
ax2.xaxis.set_major_formatter(ticker.NullFormatter())
ax2.xaxis.set_minor_locator(ticker.FixedLocator([1, 4]))
ax2.xaxis.set_minor_formatter(ticker.FixedFormatter(['JAN', 'FEB']))

for ax in (ax1, ax2):
    for spine in ['top', 'right']:
        ax.spines[spine].set_visible(False)

plt.tight_layout()
plt.show()

除了缩短, set_bounds()还可以扩展一点。 例如:

ax2.set_xticks([-0.5, 2.5, 6.5])
ax2.spines['bottom'].set_bounds([-0.5, 6.5])

调整第二个 x 轴的长度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM