在数字

时间:2017-02-06 16:31:53

标签: python matplotlib histogram

如何在matplotlib

中的数字之间移动(或复制)补丁

我正在使用一组腌制的数字,并希望将它们合并到一个情节中。 使用线图时没问题,因为我可以通过ax.get_lines访问数据。

但是,使用直方图时,ax.get_lines会返回<a list of 0 Line2D objects>。据我所知,访问绘图数据的唯一方法是ax.patches。 如果我尝试使用ax.add_patch将补丁从一个数字设置为另一个数字,我会得到RuntimeError: Can not put single artist in more than one figure

修改

我正在使用matplotlib2.0.0。 以下示例说明了问题

import numpy as np
import matplotlib.pylab as plt
import copy

# Creating the two figures
x = np.random.rand(20)
fig1, ax1 = plt.subplots()
fig2, ax2 = plt.subplots()
nr = 0
for color, ax in zip(("red", "blue"), (ax1, ax2)):
    x = np.random.rand(20) + nr
    ax.hist(x, color=color)
    nr += 0.5

# Copying from ax1 to ax2
for patch in ax1.patches:
    patch_cpy = copy.copy(patch)
    # del patch # Uncommenting seems this makes no difference
    ax2.add_patch(patch_cpy)
# RuntimeError: Can not put single artist in more than one figure

我想用红色补丁将红色补丁复制到图中。 Red patches to be copied to the figure with blue patches Figure where the red patches should be copied to

编辑2

尽管@ ImportanceOfBeingErnest的答案适用于上述案例,但它并没有解决我遇到的现实问题。 我最终创建了一个新轴,并手动创建了这样的新补丁:

import numpy as np
import matplotlib.pylab as plt
from matplotlib import patches

# Creating the two figures
x = np.random.rand(20)
fig1, ax1 = plt.subplots()
fig2, ax2 = plt.subplots()
nr = 0
for color, ax in zip(("red", "blue"), (ax1, ax2)):
    x = np.random.rand(20) + nr
    ax.hist(x, color=color)
    nr += 0.5

# Create another axis
fig3, ax3 = plt.subplots()

# Copy the properties of the patches to the new axis
for p in ax1.patches:
    ax3.add_patch(patches.Rectangle(p.get_xy(),\
                                    p.get_width(),\
                                    p.get_height(),\
                                    color = "red"))

for p in ax2.patches:
    ax3.add_patch(patches.Rectangle(p.get_xy(),\
                                    p.get_width(),\
                                    p.get_height(),\
                                    color = "blue"))

ax3.autoscale()
plt.show()

2 个答案:

答案 0 :(得分:1)

显然,只是删除艺术家的旧解决方案在matplotlib 2.0中不再起作用。
patch_cpy仍将连接到与原始轴相同的轴。您可以通过打印print patch_cpy.axes == ax1的{​​{1}}来查看此内容。

因此,解决方案可以是将True的{​​{1}}和axes属性设置为figure。我不得不承认,我不确定这是否有任何副作用,但至少下面的例子有效。
另外,复制的补丁仍然包含旧轴的数据变换。这需要使用patch_cpy进行更新。

最后,为了确保绘图限制涵盖旧的和新复制的艺术家,请使用None

patch_cpy.set_transform(ax2.transData)

答案 1 :(得分:0)

您可以复制每个patch。这是一个将所有路径从一个轴复制到另一个轴的示例:

import copy

x = np.random.rand(20)
fig, ax = plt.subplots()
for color in ("red", "blue"):
    x = np.random.rand(20)
    ax.hist(x, color=color)

fig2, ax2 = plt.subplots()
for patch in ax.patches:
    patch_cpy = copy.copy(patch)
    ax2.add_patch(patch_cpy)

如果要从第一个axes中删除修补程序,可以使用del来执行此操作,例如删除所有其他修补程序:

del ax.patches[::2]

请记住以后重绘图:

fig.canvas.draw()