Одна цветовая полоса для нескольких точечных диаграмм
Я строю несколько фигур одной и той же переменной на одном графике, используя библиотеку matplotlib
. я не ищу colorbar
для подзаголовков, которые являются доминирующим материалом поиска. Я строю несколько scatter
s, но colorbar
устанавливается только на значения последнего разброса I графика.
Вот часть кода:
plt.scatter(x1, y1, c=z1,cmap='viridis_r',marker='s')
plt.scatter(x2, y2, c=z2,cmap='viridis_r',marker='o')
plt.scatter(x3, y3, c=z3,cmap='viridis_r',marker='^')
plt.colorbar().set_label('Wind speed',rotation=270)
2 ответа:
Это требует немного дополнительной работы:
- Вы должны получить минимум и максимум
c
s (значения colorbar)- Вы должны
clim
каждый точечный рисунокСначала минимум и максимум:
zs = np.concatenate([z1, z2, z3], axis=0) min_, max_ = zs.min(), zs.max()
Тогда точечные диаграммы с
clim
:plt.scatter(x1, y1, c=z1,cmap='viridis_r',marker='s') plt.clim(min_, max_) plt.scatter(x2, y2, c=z2,cmap='viridis_r',marker='o') plt.clim(min_, max_) plt.scatter(x3, y3, c=z3,cmap='viridis_r',marker='^') plt.clim(min_, max_) plt.colorbar().set_label('Wind speed',rotation=270)
Для очень простого набора данных:
x1, x2, x3 = [1,2,3], [2,3,4], [3,4,5] y1 = y2 = y3 = [1, 2, 3] z1, z2, z3 = [1,2,3], [4,5,6], [7,8,9]
scatter
имеет аргументnorm
. Использование одного и того жеnorm
для всех рассеивателей гарантирует, что цветовая полоса, создаваемая любым из участков (следовательно, и последним), одинакова для всех участков рассеяния.
norm
может быть экземпляромNormalize
, для которого заданы минимальное и максимальное значения и который производит линейное масштабирование между ними. Конечно, вы также можете использовать любую другую норму, представленную вmatplotlib.colors
, напримерPowerNorm
,LogNorm
, и т.д.mini, maxi = 0, 2 # or use different method to determine the minimum and maximum to use norm = plt.Normalize(mini, maxi) plt.scatter(x1, y1, c=z1,cmap='viridis_r',marker='s', norm=norm) plt.scatter(x2, y2, c=z2,cmap='viridis_r',marker='o', norm=norm) plt.scatter(x3, y3, c=z3,cmap='viridis_r',marker='^', norm=norm) plt.colorbar().set_label('Wind speed',rotation=270)