在下文中,我使用散点图和自己的ListedColormap
来绘制一些彩色数据点。此外,还绘制了相应的colorbar
。
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap, ListedColormap, BoundaryNorm
from numpy import arange
fig, ax = plt.subplots()
my_cm = ListedColormap(['#a71b1b','#94258f','#ea99e6','#ec9510','#ece43b','#a3f8ff','#2586df','#035e0d'])
bounds=range(8)
norm = BoundaryNorm(bounds, my_cm.N)
data = [1,2,1,3,0,5,3,4]
ret = ax.scatter(range(my_cm.N), [1]*my_cm.N, c=data, edgecolors='face', cmap=my_cm, s=50)
cbar = fig.colorbar(ret, ax=ax, boundaries=arange(-0.5,8,1), ticks=bounds, norm=norm)
cbar.ax.tick_params(axis='both', which='both',length=0)
如果我的数据未覆盖边界间隔的每个值,则colorbar
不会显示所有颜色(如添加的图中所示)。如果data
设置为range(8)
,我会得到每种颜色的点,而colorbar
也会显示所有颜色。
即使colorbar
不包含所有边界值,如何强制data
显示所有定义的颜色?
答案 0 :(得分:2)
您需要在致电vmin
时手动设置vmax
和ax.scatter
:
ret = ax.scatter(range(my_cm.N), [1]*my_cm.N, c=data, edgecolors='face', cmap=my_cm, s=50, vmin=0, vmax=7)
导致
如果我的数据没有覆盖边界间隔的每个值,则颜色条不会显示所有颜色(如添加的图中所示)。
如果vmin
或vmax
为“无”,则通过该方法设置颜色限制
autoscale_None,因此会使用您的数据的最小值和最大值。
因此,使用您的代码实际上没有必要在颜色栏中显示边界间隔的每个值都包含的所有颜色,只需要包含最小值和最大值。
使用例如data = [0,0,0,0,0,0,0,7]
会产生以下结果:
答案 1 :(得分:1)
在寻找其他内容时,我找到了解决该问题的另一种方法:colorbar-for-matplotlib-plot-surface-command。
在这种情况下,我不需要设置import numpy as np
import matplotlib.pylab as pl
# Load file with Numpy as 2D array
f = np.loadtxt('file.txt', delimiter=',')
# Slice array (remove year column), and reshape to 1D
years = f[:,0].astype(np.int)
data = f[:,1:].reshape(-1)
# Plot!
pl.figure()
pl.bar(np.arange(data.size), data)
# Set years as x-labels
ax=pl.gca()
ax.set_xticks(np.arange(0,data.size,12))
ax.set_xticklabels(years)
和vmin
,并且如果要绘制的点的数组/列表为空,它也会起作用。相反,vmax
已定义并提供给ScalarMappable
而不是colorbar
实例。
scatter