在Matplotlib中移动坐标轴的指数

8
我希望能够在我的子图中同时在顶部和底部(或左侧和右侧)添加轴标签。其他文章已经详细说明了如何移动轴标签(例如,在这里)。然而,我在使用科学计数法时遇到了问题。以下是一个最小化的工作示例,它最好地说明了这个问题:
import numpy as np
import matplotlib.pyplot as plt

vars = 4
length = 10000

array = np.zeros((length, vars))
array[:,0] = np.random.normal(0.0, 1.0e6, (length))
array[:,1] = 1.0e6 * np.tanh(array[:,0]/1.0e6)
array[:,2] = 1.0e5 * np.random.random((length))
array[:,3] = array[:,1] * array[:,2] / 1.0e5

labels = ["var1", "var2", "var3", "var4"]

plt.figure(figsize=(15, 15))

for i in range(vars):
    for j in range(0, vars):
        ax = plt.subplot(vars, vars, vars*i + j + 1)
        ax.xaxis.get_major_formatter().set_powerlimits((-2, 3))
        ax.yaxis.get_major_formatter().set_powerlimits((-2, 3))
        ax.locator_params(nbins=5)

        if (j == i):
            weights = np.ones_like(array[:,i])/len(array[:,i])
            ax.hist(array[:,i], 25, weights=weights)
        else:
            ax.plot(array[:,j], array[:,i], '.', markersize=0.5)

        if ((j == 0) & (i % 2 == 0)):
            ax.yaxis.tick_left()
            ax.xaxis.set_ticks_position("both")
            ax.yaxis.set_label_position("left")
            ax.get_yaxis().get_offset_text().offset_text_position = "left"
            ax.set_ylabel(labels[i])
        elif ((j == vars - 1) & (i % 2 == 1)):
            ax.yaxis.tick_right()
            ax.xaxis.set_ticks_position("both")
            ax.yaxis.set_label_position("right")
            ax.get_yaxis().get_offset_text().offset_text_position = "right"
            ax.set_ylabel(labels[i])
        else:
            ax.get_yaxis().set_ticklabels([])

        if ((i == 0) & (j % 2 == 1)):
            ax.xaxis.tick_top()
            ax.xaxis.set_ticks_position("both")
            ax.xaxis.set_label_position("top")
            ax.get_xaxis().get_offset_text().offset_text_position = "top"
            ax.set_xlabel(labels[j])
        elif ((i == vars - 1) & (j % 2 == 0)):
            ax.xaxis.tick_bottom()
            ax.xaxis.set_ticks_position("both")
            ax.xaxis.set_label_position("bottom")
            ax.get_xaxis().get_offset_text().offset_text_position = "bottom"
            ax.set_xlabel(labels[j])
        else:
            ax.get_xaxis().set_ticklabels([])

plt.savefig("test.png")

这将产生以下结果: 输入图像描述 可以看到,指数并没有随着其余的刻度一起移动。我尝试了...
ax.get_yaxis().get_offset_text().offset_text_position = "right"

并且

ax.get_xaxis().get_offset_text().offset_text_position = "top"

但它们似乎没有任何效果。


就此而言,“偏移文本”是偏移量(例如+1e3),而不是乘数(1e3),这就是为什么get_offset_text().offset_text_position没有任何效果的原因。 - Joe Kington
1
请忽略我关于偏移量和乘数之间的区别的说法(虽然这也有一个常见的陷阱,例如:https://dev59.com/eV4c5IYBdhLWcg3wD2nC#28373421)。你问题的根源是你想要 ax.xaxis.offset_text_position = "top" 而不是 ax.xaxis.get_offset_text().offset_text_position() = "top" - Joe Kington
2
此外,目前版本的 matplotlib 中似乎存在一个错误。现在正在提交错误报告... - Joe Kington
我尝试按照你的建议去做,但似乎没有任何效果。那是你所提到的 bug 吗?我还尝试了 ax.get_xaxis().get_offset_text().set_y(1),但也没有任何效果。 - Jack Yates
是的,那就是我所指的错误...现在正在努力找到其根源。然而,也有可能是我错过了一些显而易见的东西,还有其他方法来完成它。据我所知,ax.<x/y>axis.offset_text_position 是您想要的主要控制方式。 - Joe Kington
显示剩余4条评论
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接