将轴显示在中心,但将标签留在左侧

时间:2019-06-19 14:22:39

标签: python pandas matplotlib

我正在尝试绘制以零为中心的分布,因此我想将y轴脊线显示为0,但我想将刻度标签本身保持在图的左侧(即,在图的外侧)。地块面积)。我认为可以通过tick_params来实现,但是labelleft选项似乎使标签居于中心。一个简短的示例如下:

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(1)

vals = np.random.normal(loc=0, scale=10, size=300)
bins = range(int(min(vals)), int(max(vals))+1)

fig, ax = plt.subplots(figsize=(15,5))
ax.hist(vals, bins=bins)

ax.spines['left'].set_position('zero')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.grid(axis='y', which='major', alpha=0.5)

plt.show()

这给您:

Histogram centred at zero

我希望标签位于网格线的左端,而不是绘图的中心。

2 个答案:

答案 0 :(得分:3)

可能不是最好的解决方案,但是您可以将左棘设置为不可见,并在0处画一条直线:

ax.spines['left'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.plot((0,0), (0,ax.get_ylim()[-1]),color='k',linewidth=1)
ax.grid(axis='y', which='major', alpha=0.5)

plt.show()

输出:

enter image description here

答案 1 :(得分:2)

可能的是指示刻度线标签在其x位置使用“轴坐标”,在其y位置使用“数据坐标”。这意味着更改其tranform属性。

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.transforms as transforms

np.random.seed(1)

vals = np.random.normal(loc=0, scale=10, size=300)
bins = range(int(min(vals)), int(max(vals))+1)

fig, ax = plt.subplots()
ax.hist(vals, bins=bins)

ax.spines['left'].set_position('zero')
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

ax.grid(axis='y', which='major', alpha=0.5)

trans = transforms.blended_transform_factory(ax.transAxes,ax.transData)
plt.setp(ax.get_yticklabels(), 'transform', trans)

plt.show()

enter image description here