26

我正在使用 matplotlib 在 python 中渲染一些图形,并将它们包含在 LaTeX 论文中(使用 LaTex 的漂亮表格对齐而不是摆弄 matplotlibImageGrid等)。我想创建并保存一个独立的颜色条savefig,而不需要使用imshow.

vlim, vmax参数,以及cmap可以显式提供的)

我能找到的唯一方法非常复杂,并且(据我所知)在画布上绘制了一个硬编码的矩形:http: //matplotlib.org/examples/api/colorbar_only.html

有没有一种优雅的方法可以用 matplotlib 创建一个独立的颜色条?

4

6 回答 6

35

您可以创建一些虚拟图像,然后隐藏它的斧头。在自定义轴中绘制您的颜色条。

import pylab as pl
import numpy as np

a = np.array([[0,1]])
pl.figure(figsize=(9, 1.5))
img = pl.imshow(a, cmap="Blues")
pl.gca().set_visible(False)
cax = pl.axes([0.1, 0.2, 0.8, 0.6])
pl.colorbar(orientation="h", cax=cax)
pl.savefig("colorbar.pdf")

结果:

在此处输入图像描述

于 2013-05-17T01:05:45.277 回答
11

使用与 HYRY 的答案相同的想法,如果您想要一个“独立”颜色条,因为它独立于图形上的项目(与它们的颜色没有直接关系),您可以执行以下操作:

from matplotlib import pyplot as plt
import numpy as np

# create dummy invisible image
# (use the colormap you want to have on the colorbar)
img = plt.imshow(np.array([[0,1]]), cmap="Oranges")
img.set_visible(False)

plt.colorbar(orientation="vertical")

# add any other things you want to the figure.
plt.plot(np.random.rand(30))
于 2016-06-29T18:34:42.063 回答
8

所以,根据这里的答案,如果你像我一样想要避免这个丑陋的假 plt.imshow(),你可以用两行来做到这一点:

import matplotlib as mpl
import matplotlib.pyplot as plt


fig, ax = plt.subplots()
col_map = plt.get_cmap('nipy_spectral')
mpl.colorbar.ColorbarBase(ax, cmap=col_map, orientation = 'vertical')

# As for a more fancy example, you can also give an axes by hand:
c_map_ax = fig.add_axes([0.2, 0.8, 0.6, 0.02])
c_map_ax.axes.get_xaxis().set_visible(False)
c_map_ax.axes.get_yaxis().set_visible(False)

# and create another colorbar with:
mpl.colorbar.ColorbarBase(c_map_ax, cmap=col_map, orientation = 'horizontal')

结果图的图片

于 2017-10-13T14:17:26.543 回答
7

对http://matplotlib.org/examples/api/colorbar_only.html的引用为我解决了这个问题。这个例子有点冗长,所以这里有一个简单的方法来制作一个独立的颜色条(为了后代)......

import matplotlib.pyplot as plt
import matplotlib as mpl

fig = plt.figure()
ax = fig.add_axes([0.05, 0.80, 0.9, 0.1])

cb = mpl.colorbar.ColorbarBase(ax, orientation='horizontal', 
                               cmap='RdBu')

plt.savefig('just_colorbar', bbox_inches='tight')

在此处输入图像描述

当然,您可以指定 Colorbar 的许多其他方面

import matplotlib.pyplot as plt
import matplotlib as mpl

fig = plt.figure()
ax = fig.add_axes([0.05, 0.80, 0.9, 0.1])

cb = mpl.colorbar.ColorbarBase(ax, orientation='horizontal', 
                               cmap='gist_ncar',
                               norm=mpl.colors.Normalize(0, 10),  # vmax and vmin
                               extend='both',
                               label='This is a label',
                               ticks=[0, 3, 6, 9])

plt.savefig('just_colorbar', bbox_inches='tight')

在此处输入图像描述

于 2020-06-17T18:33:07.093 回答
2

此解决方案还可用于独立于 ax 的内容绘制颜色条。刚设置fraction = .05

代码

import matplotlib as mpl
import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 1)

fraction = 1  # .05

norm = mpl.colors.Normalize(vmin=-3, vmax=99)
cbar = ax.figure.colorbar(
            mpl.cm.ScalarMappable(norm=norm, cmap='Blues'),
            ax=ax, pad=.05, extend='both', fraction=fraction)

ax.axis('off')
plt.show()

在此处输入图像描述

于 2020-05-04T16:29:26.900 回答
0

要添加到@blaylockbk 的答案(这是一个很好的解决方案,甚至可以添加到已经创建的图形中),对我来说,这个cmap参数不会为颜色图名称使用字符串,但是cmap = plt.cm.viridis如果有人遇到与我相同的问题,它会起作用。

于 2021-09-29T13:47:54.017 回答