Одна цветовая полоса для нескольких точечных диаграмм


Я строю несколько фигур одной и той же переменной на одном графике, используя библиотеку matplotlib. я не ищу colorbar для подзаголовков, которые являются доминирующим материалом поиска. Я строю несколько scatters, но 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 5

2 ответа:

Это требует немного дополнительной работы:

  • Вы должны получить минимум и максимум cs (значения 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)