如何在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
尽管@ 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()
答案 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()