使用散点图在颜色条上显示所有颜色

时间:2017-10-27 15:36:36

标签: python-2.7 matplotlib scatter-plot

在下文中,我使用散点图和自己的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也会显示所有颜色。

enter image description here

即使colorbar不包含所有边界值,如何强制data显示所有定义的颜色?

2 个答案:

答案 0 :(得分:2)

您需要在致电vmin时手动设置vmaxax.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)

导致

enter image description here

  

如果我的数据没有覆盖边界间隔的每个值,则颜色条不会显示所有颜色(如添加的图中所示)。

如果vminvmax为“无”,则通过该方法设置颜色限制 autoscale_None,因此会使用您的数据的最小值和最大值。

因此,使用您的代码实际上没有必要在颜色栏中显示边界间隔的每个值都包含的所有颜色,只需要包含最小值和最大值。 使用例如data = [0,0,0,0,0,0,0,7]会产生以下结果:

enter image description here

答案 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

enter image description here