使用来自 Plots.jl 的 pyplot。如何使多个子图只有一个颜色条?
Using pyplot from Plots.jl. How to make several subplots have only one colobar?
我正在使用 Plots.jl 在同一张图中绘制多个图。使用 pyplot 后端时,每个图都有自己的颜色条,我不想要它,因为它们具有相同的数据。我正在尝试复制 this question 的答案,但是我不知道 Plots.jl API 下的机器的详细信息,所以我无法复制它。我的情节是这样完成的:
using Plots;pyplot()
p1 = plot(a,st=:contour,fill=true)
p2 = plot(b,st=:contour,fill=true)
p = plot(p1,p2)
而且,来自 link 的答案(在 python 中)是这样的:
fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)
fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
fig.colorbar(im, cax=cbar_ax)
plt.show()
据我了解,for 中的代码实际上是在由 plt.subplots 创建的轴上绘制图表(在我的例子中,这是由 Plots.jl 完成的
下一行使绘图更接近,然后 fig.add_axes 行为颜色条创建一个新轴。
最后,fig.colorbar 行在新轴中创建了一个颜色条,并使用 for 循环中最后一个绘图的数据。
我当前的代码是:
cbar_ax = p.o[:add_axes]([0.85, 0.15, 0.05, 0.7]);
p.o[:colorbar](p.o[:axes][1][:contourf],cax=cbar_ax)
display(p)
而且它不起作用(我不希望它起作用,因为我不知道我在做什么。
我得到的错误是:
AttributeError("'function' object has no attribute 'autoscale_None'")
这让我觉得 p.o:axes[:contourf] 不是召唤我想要的东西的方法。
有人能帮忙吗?谢谢
一般来说,如果您想在 PyPlot 对象上使用代码,最好只使用 PyPlot 而忘记 Plots。这种混合在实践中很少奏效。
如果你确实想使用 Plots,你应该可以做到
using Plots;pyplot()
lims = extrema([a;b])
p1 = plot(a,st=:contour,fill=true, colorbar = false)
p2 = plot(b,st=:contour,fill=true, colorbar = true, clims = lims)
p = plot(p1,p2)
其中一个子图会比另一个更宽 - 您可能需要使用 @layout
进行调整以使它们具有相同的宽度。
我正在使用 Plots.jl 在同一张图中绘制多个图。使用 pyplot 后端时,每个图都有自己的颜色条,我不想要它,因为它们具有相同的数据。我正在尝试复制 this question 的答案,但是我不知道 Plots.jl API 下的机器的详细信息,所以我无法复制它。我的情节是这样完成的:
using Plots;pyplot()
p1 = plot(a,st=:contour,fill=true)
p2 = plot(b,st=:contour,fill=true)
p = plot(p1,p2)
而且,来自 link 的答案(在 python 中)是这样的:
fig, axes = plt.subplots(nrows=2, ncols=2)
for ax in axes.flat:
im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)
fig.subplots_adjust(right=0.8)
cbar_ax = fig.add_axes([0.85, 0.15, 0.05, 0.7])
fig.colorbar(im, cax=cbar_ax)
plt.show()
据我了解,for 中的代码实际上是在由 plt.subplots 创建的轴上绘制图表(在我的例子中,这是由 Plots.jl 完成的 下一行使绘图更接近,然后 fig.add_axes 行为颜色条创建一个新轴。 最后,fig.colorbar 行在新轴中创建了一个颜色条,并使用 for 循环中最后一个绘图的数据。
我当前的代码是:
cbar_ax = p.o[:add_axes]([0.85, 0.15, 0.05, 0.7]);
p.o[:colorbar](p.o[:axes][1][:contourf],cax=cbar_ax)
display(p)
而且它不起作用(我不希望它起作用,因为我不知道我在做什么。
我得到的错误是:
AttributeError("'function' object has no attribute 'autoscale_None'")
这让我觉得 p.o:axes[:contourf] 不是召唤我想要的东西的方法。
有人能帮忙吗?谢谢
一般来说,如果您想在 PyPlot 对象上使用代码,最好只使用 PyPlot 而忘记 Plots。这种混合在实践中很少奏效。 如果你确实想使用 Plots,你应该可以做到
using Plots;pyplot()
lims = extrema([a;b])
p1 = plot(a,st=:contour,fill=true, colorbar = false)
p2 = plot(b,st=:contour,fill=true, colorbar = true, clims = lims)
p = plot(p1,p2)
其中一个子图会比另一个更宽 - 您可能需要使用 @layout
进行调整以使它们具有相同的宽度。