首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Matplotlib中从两个轴取消“`sharex`”或“`sharey`”

如何在Matplotlib中从两个轴取消“`sharex`”或“`sharey`”
EN

Stack Overflow用户
提问于 2019-02-27 21:56:10
回答 3查看 4.4K关注 0票数 7

我有一系列的子图,我希望它们共享x和y轴,除了两个子图(基于每行)。

我知道,可以分别创建所有子图,然后创建 functionality afterward

然而,这是大量的代码,因为我必须这样做的大多数子图。

一个更有效的方法是创建所有具有所需的sharex/sharey属性的子图,例如:

代码语言:javascript
复制
import matplotlib.pyplot as plt

fix, axs = plt.subplots(2, 10, sharex='row', sharey='row', squeeze=False)

然后设置取消设置hypothetically / sharex/sharey功能,其工作方式如下:

代码语言:javascript
复制
axs[0, 9].sharex = False
axs[1, 9].sharey = False

上面的方法不起作用,但有什么方法可以获得这一点吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-27 23:07:00

您可以使用ax.get_shared_x_axes()获取包含所有链接轴的Grouper对象。然后使用group.remove(ax)从该组中移除指定的轴。您还可以通过group.join(ax1, ax2)添加一个新的份额。

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots(2, 10, sharex='row', sharey='row', squeeze=False)

data = np.random.rand(20, 2, 10)
for row in [0,1]:
    for col in range(10):
        n = col*(row+1)
        ax[row, col].plot(data[n,0], data[n,1], '.')

a19 = ax[1,9]

shax = a19.get_shared_x_axes()
shay = a19.get_shared_y_axes()
shax.remove(a19)
shay.remove(a19)

a19.clear()
d19 = data[-1] * 5
a19.plot(d19[0], d19[1], 'r.')

plt.show()

这仍然需要一些调整来设置滴答,但右下角的地块现在有了自己的限制。

票数 4
EN

Stack Overflow用户

发布于 2019-06-28 15:33:06

正如@zan在their answer中所指出的那样,您可以使用ax.get_shared_x_axes()获取一个包含所有链接轴的Grouper对象,然后从这个Grouper获取任何轴。问题是(正如@WMiller所指出的),所有轴的代码仍然是相同的。

所以我们需要

  1. 从石斑鱼上取下斧头
  2. 用各自的新定位器和格式化程序设置一个新的Ticker

完整示例

代码语言:javascript
复制
import matplotlib
import matplotlib.pyplot as plt
import numpy as np

fig, axes = plt.subplots(3, 4, sharex='row', sharey='row', squeeze=False)

data = np.random.rand(20, 2, 10)

for ax in axes.flatten()[:-1]:
    ax.plot(*np.random.randn(2,10), marker="o", ls="")



# Now remove axes[1,5] from the grouper for xaxis
axes[2,3].get_shared_x_axes().remove(axes[2,3])

# Create and assign new ticker
xticker = matplotlib.axis.Ticker()
axes[2,3].xaxis.major = xticker

# The new ticker needs new locator and formatters
xloc = matplotlib.ticker.AutoLocator()
xfmt = matplotlib.ticker.ScalarFormatter()

axes[2,3].xaxis.set_major_locator(xloc)
axes[2,3].xaxis.set_major_formatter(xfmt)

# Now plot to the "ungrouped" axes
axes[2,3].plot(np.random.randn(10)*100+100, np.linspace(-3,3,10), 
                marker="o", ls="", color="red")

plt.show()

请注意,在上面,我只改变了x轴的滴答,也只对主要的滴答。如果需要的话,你也需要对y轴和小滴答做同样的操作。

票数 7
EN

Stack Overflow用户

发布于 2019-02-28 00:08:13

您可以使用ax.get_shared_x_axes()或属性ax._shared_y_axes访问共享轴组。然后,您可以使用xaxis.set_tick_params(which='both', labelleft=True)setp(ax, get_xticklabels(), visible=True)重置标签的可见性,但是这两种方法都有一个固有的问题:滴答格式化程序仍然在轴之间共享。据我所知,这是无法避免的。下面是一个演示的例子:

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(1)
fig, axs = plt.subplots(2, 2, sharex='row', sharey='row', squeeze=False)
axs[0][0]._shared_x_axes.remove(axs[0][0])
axs[0][0]._shared_y_axes.remove(axs[0][0])

for ii in range(2):
    for jj in range(2):
        axs[ii][jj].plot(np.random.randn(100), np.linspace(0,ii+jj+1, 100))

axs[0][1].yaxis.set_tick_params(which='both', labelleft=True)
axs[0][1].set_yticks(np.linspace(0,2,7))
plt.show()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54915124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档