将colorbar放在图中

Gab*_*iel 10 python matplotlib color-mapping

我有一个简单的散点图,其中每个点都有一个颜色,由0到1之间的值设置为选定的颜色图.这MWE是我的代码:

import matplotlib.pyplot as plt 
import numpy as np
import matplotlib.gridspec as gridspec

x = np.random.randn(60) 
y = np.random.randn(60)
z = [np.random.random() for _ in range(60)]

fig = plt.figure()
gs = gridspec.GridSpec(1, 2)

ax0 = plt.subplot(gs[0, 0])
plt.scatter(x, y, s=20)

ax1 = plt.subplot(gs[0, 1])
cm = plt.cm.get_cmap('RdYlBu_r')
plt.scatter(x, y, s=20 ,c=z, cmap=cm)
cbaxes = fig.add_axes([0.6, 0.12, 0.1, 0.02]) 
plt.colorbar(cax=cbaxes, ticks=[0.,1], orientation='horizontal')

fig.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

PIC

这里的问题是我想要将小的水平颜色条位置放在图的左下方,但使用cax参数不仅感觉有点hacky,它显然与tight_layout导致警告的结果相冲突:

/usr/local/lib/python2.7/dist-packages/matplotlib/figure.py:1533: UserWarning: This figure includes Axes that are not compatible with tight_layout, so its results might be incorrect.
  warnings.warn("This figure includes Axes that are not "
Run Code Online (Sandbox Code Playgroud)

是不是有更好的方法来定位colorbar,即每当你运行代码时没有得到一个令人讨厌的警告?


编辑

我希望colorbar只显示最大值和最小值,即:0和1,Joe通过添加vmin=0, vmax=1scatter这样来帮助我这样做:

plt.scatter(x, y, s=20, vmin=0, vmax=1)
Run Code Online (Sandbox Code Playgroud)

所以我要删除这部分问题.

Imp*_*est 6

可以使用a mpl_toolkits.axes_grid1.inset_locator.inset_axes将轴放置在另一个轴内.该轴可用于托管彩条.它的位置是相对于父轴的,类似于如何使用loc参数放置图例(例如,loc=3表示左下).它的宽度和高度可以用绝对数字(英寸)或相对于父轴(百分比)来指定.

cbaxes = inset_axes(ax1, width="30%", height="3%", loc=3) 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

import matplotlib.pyplot as plt 
import numpy as np
import matplotlib.gridspec as gridspec
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

x = np.random.randn(60) 
y = np.random.randn(60)
z = [np.random.random() for _ in range(60)]

fig = plt.figure()
gs = gridspec.GridSpec(1, 2)

ax0 = plt.subplot(gs[0, 0])
plt.scatter(x, y, s=20)

ax1 = plt.subplot(gs[0, 1])
cm = plt.cm.get_cmap('RdYlBu_r')
plt.scatter(x, y, s=20 ,c=z, cmap=cm)

fig.tight_layout()

cbaxes = inset_axes(ax1, width="30%", height="3%", loc=3) 
plt.colorbar(cax=cbaxes, ticks=[0.,1], orientation='horizontal')


plt.show()
Run Code Online (Sandbox Code Playgroud)

请注意,为了抑制警告,可以tight_layout在添加插入轴之前简单地调用.

  • 不,不必担心坐标**是**优势。在这个简单的情况下,它可能不太明显,但在一般情况下,您甚至可能不知道需要使用 `add_axes` 放置轴的坐标,而 `inset_axes` 确保轴位于其他轴内并相对于它定位。 (2认同)