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