强制 matplotlib 刻度标签不比轴宽

问题描述 投票:0回答:1

我需要使用 matplotlib 制作一个具有共享 y 轴的非常紧凑的绘图。为了使它紧凑和整洁,我不会有任何 wspace。根据我的数据看起来不错。

但是 x 刻度标签重叠,导致它们不可读。

有没有办法让 x 刻度定位器不在轴的“边缘”放置刻度,使标签调整位置以使它们落在轴宽度内,或者使它们自动检测碰撞?或者是否有更好的方法来避免将轴靠近放置时 x 刻度标签发生碰撞?

标签冲突示例:

import matplotlib.pyplot as plt
import matplotlib.ticker
fig,axs = plt.subplots(1,2,figsize=(2,2),gridspec_kw={'wspace':0},sharey=True)
axs[0].plot([0.1,0.2,0.3],[0,2,3])
axs[0].xaxis.set_major_formatter(matplotlib.ticker.PercentFormatter(xmax=1))
axs[0].xaxis.set_tick_params(labelsize=5)
axs[0].yaxis.set_tick_params(labelsize=5)
axs[1].plot([3,2,1],[1,2,3])
axs[1].yaxis.set_tick_params(labelleft=False,size=0)
axs[1].xaxis.set_tick_params(labelsize=5)

a plot with two panels. the x axis label are overplotted

手动校正刻度线和界限的示例看起来不错,但需要手动容易出错的后缀。

import matplotlib.pyplot as plt
import matplotlib.ticker
fig,axs = plt.subplots(1,2,figsize=(2,2),gridspec_kw={'wspace':0},sharey=True)
axs[0].plot([0.1,0.2,0.3],[0,2,3])
axs[0].xaxis.set_major_formatter(matplotlib.ticker.PercentFormatter(xmax=1))
axs[0].xaxis.set_tick_params(labelsize=5)
axs[0].yaxis.set_tick_params(labelsize=5)
axs[0].set_xlim(0.05,0.32)
axs[0].set_xticks([0.1,0.2,0.3])
axs[1].plot([3,2,1],[1,2,3])
axs[1].yaxis.set_tick_params(labelleft=False,size=0)
axs[1].xaxis.set_tick_params(labelsize=5)
axs[1].set_xlim(0.7,3.2)
axs[1].set_xticks([1,2,3])

same but better

python matplotlib
1个回答
0
投票

right, left

您可以操纵刻度标签的文本,特别是它们的水平对齐方式。

请注意,文本对象列表增加了两个,例如,对于第二个轴,它是“0”、“1”、“2”、“3”、“4”。

import matplotlib.pyplot as plt

fig, (ax0, ax1) = plt.subplots(1, 2, figsize=(2.2, 2),
                               gridspec_kw={'wspace':0},
                               sharey=True)
ax0.plot([0.1, 0.2, 0.3], [0, 2, 3])
ax1.plot([3, 2, 1], [1, 2, 3])

l0 = ax0.get_xticklabels()
l0[-2].set_horizontalalignment('right')
ax0.set_xticklabels(l0)

l1 = ax1.get_xticklabels()
l1[+1].set_horizontalalignment('left')
ax1.set_xticklabels(l1)

fig.savefig('Figure_1.png')
© www.soinside.com 2019 - 2024. All rights reserved.