y在matplotlib图中标记右侧,共享x和y

时间:2015-02-24 11:32:56

标签: python matplotlib

我正在尝试修改mpl example,每列共享x,每行y,我想将y刻度标签放在右侧。 我尝试了类似于this的解决方案,即

import matplotlib.pyplot as plt
import numpy as np

# Simple data to display in various forms
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

plt.close('all')

# row and column sharing
f, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, sharex='col', sharey='row')
ax1.plot(x, y)
ax1.set_title('Sharing x per column, y per row')
ax2.scatter(x, y)
ax3.scatter(x, 2 * y ** 2 - 1, color='r')
ax4.plot(x, 2 * y ** 2 - 1, color='r')

#my "contribution" to the code:

for ax in [ax1,ax3]:
    ax.yaxis.set_ticks_position('both')
    ax.set_yticklabels([])
for ax in [ax2,ax4]:
    ax.yaxis.set_ticks_position('both')
    ax.yaxis.tick_right()#right hand side tickslabels

plt.show()

哪个适用于单个情节,但不适用于此:根本没有y刻度标签。 建议?将x标签放在顶部也是同样的问题。

如果我只使用第二个循环,我会在第一列中获得示例输出,并且至少在第二列中获得右侧y刻度标签,但左侧刻度在第二列中消失。为什么会这样?

1 个答案:

答案 0 :(得分:0)

当你保持第一个循环时,对ax.set_yticklabels([])的调用会杀死你的勾选标签的所有,因为当你共享轴时,勾选标签文本会被链接。使用axes_grid1的演示here演示了一些方法,如果你想要不同的刻度/标签。

但是,对于这个简单的示例,您可以专门将ticklabels设置为右侧,并单独拉出相关的其他标签对象以关闭其可见性。如果您使用以下内容替换已修改的部分:

for ax in [ax1,ax3]:
    for label in ax.get_yticklabels():
        label.set_visible(False)
for ax in [ax2,ax4]:
    # Change the labelling only
    ax.yaxis.set_tick_params(labelright='on', labelleft='off')

右侧有刻度标签。我不确定这是否是最有效的方法,但它确实有效。

example with ticks on the right side