这是另一个示例,根据年龄为散点图着色。
BoundaryNorm 为每个年龄段设置了界限,并为每个年龄段关联了一种颜色。
例如,如果有年龄范围< 18, 18-40, 40-65, 65-80, > 80,您可以将这些界限列为[18,40,65,80]。 BoundaryNorm 需要比颜色数量多一个边界,因此您可以在前面添加0,在末尾添加100。
您可以从现有颜色图创建颜色图,提供所需的颜色数量:plt.cm.get_cmap('plasma_r', len(boundaries)+1) 或作为 ListedColormap,为其提供明确的颜色列表:matplotlib.colors.ListedColormap([...])。
示例代码:
import matplotlib
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np
N = 30
df = pd.DataFrame({'x': np.random.randint(4,12,N),
'y': np.random.randint(4,10,N),
'birthdt': np.random.randint(1,95, N)})
boundaries = [18, 40, 65, 80]
cmap = matplotlib.colors.ListedColormap(['limegreen', 'dodgerblue', 'crimson', 'orange', 'fuchsia'])
# cmap = plt.cm.get_cmap('plasma_r', len(boundaries) + 1)
norm = matplotlib.colors.BoundaryNorm([0]+boundaries+[100], len(boundaries)+1)
plt.scatter(df.x, df.y, s=60, c=df.birthdt, cmap=cmap, norm=norm)
cbar = plt.colorbar(extend='max')
cbar.ax.set_ylabel('Age')
plt.show()
如果您希望颜色条分隔与年龄范围成比例,您可以尝试:
import matplotlib
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np
N = 30
df = pd.DataFrame({'x': np.random.randint(4, 12, N),
'y': np.random.randint(4, 10, N),
'birthdt': np.random.randint(1, 95, N)})
boundaries = [18, 30, 65, 80]
max_age = 100
base_colors = ['limegreen', 'dodgerblue', 'crimson', 'orange', 'fuchsia']
full_colors = [c for c, b0, b1 in zip(base_colors, [0] + boundaries, boundaries + [max_age]) for i in range(b1 - b0)]
cmap_full = matplotlib.colors.ListedColormap(full_colors)
norm_full = matplotlib.colors.Normalize(vmin=0, vmax=max_age)
plt.scatter(df.x, df.y, s=60, c=df.birthdt, cmap=cmap_full, norm=norm_full)
cbar = plt.colorbar(extend='max', ticks=boundaries)
cbar.ax.set_ylabel('Age')
plt.show()