【发布时间】:2019-01-31 06:24:29
【问题描述】:
我正在尝试在单个图中的一行中绘制两个 3D 线框图和一个颜色条。为了在线框上应用颜色渐变,我遵循了Stackoverflow Answer。因此,我不得不生成独立的颜色条。由于我使用的是tight_layout,所以颜色条占用了整个高度并以较大的宽度出现。
到目前为止,我找不到任何控制颜色条大小的解决方案。我尝试更改网格的width_ratio,但宽度保持不变。 tight layout中好像不能调整高度。
我的绘图代码如下。我将不胜感激在这方面的任何帮助。
def plot_signature(hh, hv, vh, vv, wireframe=False):
x_c, y_c, z_c = synthesize(hh=hh, hv=hv, vh=vh, vv=vv, channel=False)
x_x, y_x, z_x = synthesize(hh=hh, hv=hv, vh=vh, vv=vv, channel=True)
xticks = np.linspace(0, 180, 13)
yticks = np.linspace(-45, 45, 7)
zticks = np.linspace(0, 1, 11)
xt_labels = np.core.defchararray.add(xticks.astype(int).astype(str), u"\u00b0")
yt_labels = np.core.defchararray.add(yticks.astype(int).astype(str), u"\u00b0")
plt.ion()
fig = plt.figure(tight_layout=True)
grid = fig.add_gridspec(nrows=1, ncols=3, width_ratios=[1, 10, 10])
ax_cbar = fig.add_subplot(grid[0, 0])
ax_cpol = fig.add_subplot(grid[0, 1], projection='3d')
ax_xpol = fig.add_subplot(grid[0, 2], projection='3d')
ax_cpol.set_xlim([0, 180])
ax_cpol.set_ylim([-45, 45])
ax_cpol.set_zlim([0, 1])
ax_xpol.set_xlim([0, 180])
ax_xpol.set_ylim([-45, 45])
ax_xpol.set_zlim([0, 1])
cfont = {'fontname':'CMU Serif'}
color_map = cm.rainbow
if wireframe:
norm_c = plt.Normalize(z_c.min(), z_c.max())
norm_x = plt.Normalize(z_x.min(), z_x.max())
colors_c = color_map(norm_c(z_c))
colors_x = color_map(norm_c(z_x))
rcount_c, ccount_c, _ = colors_c.shape
rcount_x, ccount_x, _ = colors_x.shape
pfig_c = ax_cpol.plot_surface(x_c, y_c, z_c, rcount=rcount_c, ccount=ccount_c, facecolors=colors_c, shade=False)
pfig_x = ax_xpol.plot_surface(x_x, y_x, z_x, rcount=rcount_x, ccount=ccount_x, facecolors=colors_x, shade=False)
pfig_c.set_facecolor((0, 0, 0, 0))
pfig_x.set_facecolor((0, 0, 0, 0))
else:
ax_cpol.plot_surface(x_c, y_c, z_c, cmap=color_map, linewidth=0, antialiased=True)
ax_xpol.plot_surface(x_x, y_x, z_x, cmap=color_map, linewidth=0, antialiased=True)
ax_cpol.set_xticks(xticks)
ax_xpol.set_xticks(xticks)
ax_cpol.set_xticklabels(xt_labels)
ax_xpol.set_xticklabels(xt_labels)
ax_cpol.set_yticks(yticks)
ax_xpol.set_yticks(yticks)
ax_cpol.set_yticklabels(yt_labels)
ax_xpol.set_yticklabels(yt_labels)
ax_cpol.set_xlabel('Orientation Angle ($\psi$)', labelpad=16, fontsize=16, **cfont)
ax_xpol.set_xlabel('Orientation Angle ($\psi$)', labelpad=16, fontsize=16, **cfont)
ax_cpol.set_ylabel('Ellipticity Angle ($\chi$)', labelpad=16, fontsize=16, **cfont)
ax_xpol.set_ylabel('Ellipticity Angle ($\chi$)', labelpad=16, fontsize=16, **cfont)
ax_cpol.set_zlabel("Relative Intensity", labelpad=16, fontsize=16, **cfont)
ax_xpol.set_zlabel("Relative Intensity", labelpad=16, fontsize=16, **cfont)
ax_cpol.set_zticks(zticks)
ax_xpol.set_zticks(zticks)
ax_cpol.set_title("Co-pol Signature", fontsize=20, pad=20, **cfont)
ax_xpol.set_title("Cross-pol Signature", fontsize=20, pad=20, **cfont)
cb_norm = mpl.colors.Normalize(vmin=0,vmax=1)
cb_ticks = np.linspace(0.0, 1.0, 11)
cb = mpl.colorbar.ColorbarBase(
ax_cbar,cmap=color_map,
norm=cb_norm,ticks=cb_ticks,
label='Color Map',
orientation='vertical'
)
cb_label = cb.ax.yaxis.label
cb.ax.yaxis.labelpad = 10
custom_font = mpl.font_manager.FontProperties(family='CMU Serif', size=12)
cb_label.set_font_properties(custom_font)
plt.show()
目前剧情如下:
但是,我希望它如下所示:
【问题讨论】:
-
尝试使用
shrink、aspect和fraction颜色条参数matplotlib.org/api/_as_gen/matplotlib.pyplot.colorbar.html -
我正在使用matplotlib.colorbar.ColorbarBase 对象,因为它是一个独立的颜色条。不幸的是,ColorbarBase 对象不支持
shrink、aspect或fraction(见答案:Stackoverflow Question);它继承了父坐标区的属性。 -
在这种情况下,使用
ax参数来设置您自己的颜色条:matplotlib.org/gallery/axes_grid1/… 和 stackoverflow.com/a/13311914/2666859
标签: python-3.x matplotlib