我花了太长时间研究如何在Matplotlib中使两个子图共享同一y轴,并在两个子图之间共享一个颜色条。
所发生的事情是,当我在subplot1
或subplot2
中调用colorbar()
函数时,它会自动缩放绘图,这样colorbar加上绘图就可以放在“subplot”边界框中,导致两个并排绘图的大小非常不同。
为了解决这个问题,我试图创建第三个子情节,然后我黑客攻击它,使其不呈现仅有颜色条的情节。唯一的问题是,现在两个地块的高度和宽度都不均匀,我想不出如何让它看起来还可以。
这是我的密码:
from __future__ import division
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import patches
from matplotlib.ticker import NullFormatter
# SIS Functions
TE = 1 # Einstein radius
g1 = lambda x,y: (TE/2) * (y**2-x**2)/((x**2+y**2)**(3/2))
g2 = lambda x,y: -1*TE*x*y / ((x**2+y**2)**(3/2))
kappa = lambda x,y: TE / (2*np.sqrt(x**2+y**2))
coords = np.linspace(-2,2,400)
X,Y = np.meshgrid(coords,coords)
g1out = g1(X,Y)
g2out = g2(X,Y)
kappaout = kappa(X,Y)
for i in range(len(coords)):
for j in range(len(coords)):
if np.sqrt(coords[i]**2+coords[j]**2) <= TE:
g1out[i][j]=0
g2out[i][j]=0
fig = plt.figure()
fig.subplots_adjust(wspace=0,hspace=0)
# subplot number 1
ax1 = fig.add_subplot(1,2,1,aspect='equal',xlim=[-2,2],ylim=[-2,2])
plt.title(r"$\gamma_{1}$",fontsize="18")
plt.xlabel(r"x ($\theta_{E}$)",fontsize="15")
plt.ylabel(r"y ($\theta_{E}$)",rotation='horizontal',fontsize="15")
plt.xticks([-2.0,-1.5,-1.0,-0.5,0,0.5,1.0,1.5])
plt.xticks([-2.0,-1.5,-1.0,-0.5,0,0.5,1.0,1.5])
plt.imshow(g1out,extent=(-2,2,-2,2))
plt.axhline(y=0,linewidth=2,color='k',linestyle="--")
plt.axvline(x=0,linewidth=2,color='k',linestyle="--")
e1 = patches.Ellipse((0,0),2,2,color='white')
ax1.add_patch(e1)
# subplot number 2
ax2 = fig.add_subplot(1,2,2,sharey=ax1,xlim=[-2,2],ylim=[-2,2])
plt.title(r"$\gamma_{2}$",fontsize="18")
plt.xlabel(r"x ($\theta_{E}$)",fontsize="15")
ax2.yaxis.set_major_formatter( NullFormatter() )
plt.axhline(y=0,linewidth=2,color='k',linestyle="--")
plt.axvline(x=0,linewidth=2,color='k',linestyle="--")
plt.imshow(g2out,extent=(-2,2,-2,2))
e2 = patches.Ellipse((0,0),2,2,color='white')
ax2.add_patch(e2)
# subplot for colorbar
ax3 = fig.add_subplot(1,1,1)
ax3.axis('off')
cbar = plt.colorbar(ax=ax2)
plt.show()
此解决方案不需要手动调整轴位置或颜色条大小,适用于多行和单行布局,适用于tight_layout()
。它改编自一个库示例,使用matplotlib的AxesGrid工具箱中的ImageGrid
。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import ImageGrid
# Set up figure and image grid
fig = plt.figure(figsize=(9.75, 3))
grid = ImageGrid(fig, 111, # as in plt.subplot(111)
nrows_ncols=(1,3),
axes_pad=0.15,
share_all=True,
cbar_location="right",
cbar_mode="single",
cbar_size="7%",
cbar_pad=0.15,
)
# Add data to image grid
for ax in grid:
im = ax.imshow(np.random.random((10,10)), vmin=0, vmax=1)
# Colorbar
ax.cax.colorbar(im)
ax.cax.toggle_label(True)
#plt.tight_layout() # Works, but may still require rect paramater to keep colorbar labels visible
plt.show()
您可以使用带有轴列表的ax
参数figure.colorbar()来简化Joe Kington的代码。从留档:
斧头
无|父轴对象,从中窃取新颜色条轴的空间。如果给出了轴的列表,它们都将被调整大小,为颜色条轴腾出空间。
import numpy as np
import matplotlib.pyplot as plt
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.colorbar(im, ax=axes.ravel().tolist())
plt.show()
只需将颜色条放在自己的轴上,并使用subplots_adjust
为其腾出空间。
举个简单的例子:
import numpy as np
import matplotlib.pyplot as plt
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()
请注意,即使值的范围由vmin
和vmax
设置,颜色范围也将由最后绘制的图像(产生im
)设置。例如,如果另一个绘图的最大值较高,则值高于最大值的点将以统一颜色显示。
因此,我有一段代码,它以我需要的格式愉快地显示了一个图形: 我想让图表中的一个条显示为不同于上面代码中设置的颜色。
问题:我正在使用matplotlib创建一个带有多个子情节的图形。每个子图都有x轴和y轴标签,也可能有自己的颜色条。 默认情况下,轴标签放置在刻度标记旁边(图1,左)。然而,我希望y轴标签垂直对齐(图1,右)。我使用来做这件事。 我想在每个子图上包括颜色条(图2,左)。但是,当我使用时,轴标签只是折叠到相同的位置(图2,右)。 问题:使用色条时,如何对齐y轴标签?
自定颜色设置 对于大多数色彩管理工作流程,最好使用 Adobe Systems 已经测试过的预设颜色设置。只有在色彩管理知识很丰富并且对自己所做的更改非常有信心的时候,才建议您更改特定选项。 自定选项完成后,可以将它们保存为预设。保存颜色设置确保您可以再次使用它们并与其他用户或应用程序共享。 要将颜色设置保存为预设,请单击 “颜色设置”对话框中的“存储”。要确保应用程序在 “颜色设置”对话框中显示
问题内容: 我有一个动画,其中数据范围变化很大。我想有一个跟踪数据的最大值和最小值(即我希望它不固定)。问题是如何做到这一点。 理想情况下,我希望该轴独立。 我尝试了以下四件事 1.天真的方法 问题:每帧都有一个新的彩条 2.添加到图像 将上面的for循环更改为 问题:这引起了 3.在自己的轴上绘制 问题:尚未更新。 2.和4.的组合 问题:常数。 问题答案: 虽然我不确定如何使用来具体实现,
我怎么能只为星的一半设置一个颜色呢?就像下图一样?
当前结果:下边框为灰色 所需结果:所有边框均为白色 问题:CSS中的边框颜色设置为白色