我想用彩条生成等高线图/热图,然后添加注释框。这个数字太丑了,但得到了我想要的东西:
add_subplot()
还不够。如果我试图将所有内容放在同一个子图中,则该框会被掩盖。我可以通过使其可拖动然后用图像的大小进行预测来解决这个问题,但这并不好。我将不得不制作一些标准尺寸的图像,而且我不能一次又一次地与大小对抗。
我也尝试了axes()
,将盒子放在一个单独的轴上。但是这会产生一个新的绘图窗口,覆盖了我的大部分颜色条。我想有办法让窗户完全透明。但是当我达到这一点时,我认为我的做法一定是完全错误的。
这似乎不应该那么难。有什么想法吗?
答案 0 :(得分:4)
完成这样:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
from numpy.random import randn
from mpl_toolkits.axes_grid1.axes_divider import HBoxDivider
import mpl_toolkits.axes_grid1.axes_size as Size
def make_heights_equal(fig, rect, ax1, ax2, ax3, pad):
# pad in inches
h1, v1 = Size.AxesX(ax1), Size.AxesY(ax1)
h2, v2 = Size.AxesX(ax2, 0.1), Size.AxesY(ax2)
h3, v3 = Size.AxesX(ax3), Size.AxesY(ax3)
pad_v = Size.Scaled(1)
pad_h = Size.Fixed(pad)
my_divider = HBoxDivider(fig, rect,
horizontal=[h1, pad_h, h2, pad_h, h3],
vertical=[v1, pad_v, v2, pad_v, v3])
ax1.set_axes_locator(my_divider.new_locator(0))
ax2.set_axes_locator(my_divider.new_locator(2))
ax3.set_axes_locator(my_divider.new_locator(4))
# Make plot with vertical (default) colorbar
fig = plt.figure()
img_ax = fig.add_subplot(131)
bar_ax = fig.add_subplot(132)
ann_ax = fig.add_subplot(133)
data = np.clip(randn(250, 250), -1, 1)
im = img_ax.imshow(data, interpolation='nearest', cmap=cm.coolwarm)
# Add colorbar, make sure to specify tick locations to match desired ticklabels
cbar = fig.colorbar(im, cax=bar_ax, ticks=[-1, 0, 1])
cbar.ax.set_yticklabels(['< -1', '0', '> 1'])# vertically oriented colorbar
ann_ax.axis('off')
ann_ax.annotate("Hello, I'm an annotation", (0.5, 0.5),
xycoords="axes fraction", va="center", ha="center",
bbox=dict(boxstyle="round, pad=1", fc="w"))
make_heights_equal(fig, 111, img_ax, bar_ax, ann_ax, 0.2)
plt.savefig("try.png")
答案 1 :(得分:2)
这是一个相当简单的解决方案,使用make_axes_locatable
中的mpl_toolkits.axes_grid1
函数,因为这会使颜色条与图像的高度相同。此外,可以非常轻松地设置颜色条相对于Axes
的位置,宽度和填充。
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib import cm
from numpy.random import randn
# Make plot with vertical (default) colorbar
fig = plt.figure()
ax = fig.add_subplot(121, aspect='equal')
ax2 = fig.add_subplot(122, aspect='equal')
ax2.axis('off')
divider = make_axes_locatable(ax)
# Specify placement, width and padding of colorbar
cax = divider.append_axes("right", size="10%", pad=0.1)
data = np.clip(randn(250, 250), -1, 1)
im = ax.imshow(data, interpolation='nearest', cmap=cm.coolwarm)
ax.set_title('Title')
# Add colorbar, make sure to specify tick locations to match desired ticklabels
cbar = fig.colorbar(im, cax=cax, ticks=[-1, 0, 1])
cbar.ax.set_yticklabels(['< -1', '0', '> 1'])# vertically oriented colorbar
# Add text
boxtext = \
"""Text box
Second line
Third line"""
props = dict(boxstyle='round, pad=1', facecolor='white', edgecolor='black')
ax2.text(0.15, 0.85, boxtext, ha='left', va='top', transform=ax2.transAxes, bbox=props)
#plt.tight_layout()
plt.savefig(r'D:\image.png', bbox_inches='tight', dpi=150)
答案 2 :(得分:1)
这就是我要去的地方:
import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np
from numpy.random import randn
import pickle
data = np.clip(randn(250, 250), -1, 1)
fig3 = plt.figure()
ax1 = fig3.add_axes([.1,.1,.55,.8])
ax2 = fig3.add_axes([.7,.1,.05,.8])
ax3 = fig3.add_axes([.78,.1,.1,.8])
ax3.axis('off')
hm = ax1.pcolor(data, cmap=cm.coolwarm)
plt.colorbar(hm,cax = ax2)
bbox_args = dict(boxstyle='square',facecolor='white')
ann = ax3.annotate('More info here', xy=(.2,.8),
xytext=(.2,.8), transform=ax3.transAxes, bbox=bbox_args)
plt.show()
结果是:
并不是说这比其他答案更好(我非常感激!)但我能理解它(!)并且很容易调整它。我不会选择自己的答案,因为阅读其他答案是让我思考自己需要做的事情。 (特别是,不知道轴('关')并没有考虑将色条放在自己的轴对象上。我提到我是菜鸟吗?)无论如何,如果有人想要第三种选择,这就是这个。