Точечная диаграмма и отображение цветов в Python

91

У меня есть диапазон точек x и y, хранящихся в массивах numpy. Они представляют x (t) и y (t), где t = 0 ... T-1

Я рисую диаграмму рассеяния, используя

import matplotlib.pyplot as plt

plt.scatter(x,y)
plt.show()

Я хотел бы иметь цветовую карту, представляющую время (поэтому окраска точек в зависимости от индекса в массивах numpy)

Как проще всего это сделать?

Винсент
источник

Ответы:

170

Вот пример

import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(100)
y = np.random.rand(100)
t = np.arange(100)

plt.scatter(x, y, c=t)
plt.show()

Здесь вы устанавливаете цвет на основе индекса t, который представляет собой просто массив [1, 2, ..., 100]. введите описание изображения здесь

Возможно, более простой для понимания пример - это немного проще

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
plt.scatter(x, y, c=t)
plt.show()

введите описание изображения здесь

Обратите внимание, что массив, который вы передаете как c, не обязательно должен иметь какой-либо конкретный порядок или тип, то есть его не нужно сортировать или целые числа, как в этих примерах. Программа построения масштабирует цветовую карту таким образом, чтобы минимальные / максимальные значения cсоответствовали нижнему / верхнему краю цветовой карты.

Цветовые карты

Вы можете изменить цветовую карту, добавив

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.cmap_name)

Импорт не matplotlib.cmявляется обязательным, поскольку вы также можете вызывать палитру cmap="cmap_name". Существует справочная страница с цветовой картой, показывающей, как каждая из них выглядит. Также знайте, что вы можете отменить цветовую карту, просто назвав ее cmap_name_r. Так что либо

plt.scatter(x, y, c=t, cmap=cm.cmap_name_r)
# or
plt.scatter(x, y, c=t, cmap="cmap_name_r")

будет работать. Примеры: "jet_r"или cm.plasma_r. Вот пример с новой цветовой картой viridis 1.5:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(100)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')
plt.show()

введите описание изображения здесь

Палитра цветов

Вы можете добавить палитру с помощью

plt.scatter(x, y, c=t, cmap='viridis')
plt.colorbar()
plt.show()

введите описание изображения здесь

Обратите внимание, что если вы явно используете рисунки и подзаголовки (например, fig, ax = plt.subplots()или ax = fig.add_subplot(111)), добавление шкалы цветов может быть немного сложнее. Здесь можно найти хорошие примеры для одной цветовой шкалы подзаголовка, а здесь - для 2 подзаголовков 1 шкалу цвета .

wflynny
источник
1
Вы можете получить легенду для цветов с помощью plt.colorbar()команды.
drevicko 02
Похоже, что код здесь изменился. Cmap = cm.colormap_name теперь должно быть cmap = cm.cmapname.
Крис
@ cmarti1138 Я не уверен, что вы имеете в виду, cm.colormap_nameа cm.cmapnameне фактические переменные в matplotlib.cm; это просто псевдокод для cm.jetor cm.veridis_rи т. д.
wflynny
Есть ли способ изменить список cmapили cсписок уже построенной кривой?
Guimoute
10

Чтобы добавить к ответу wflynny выше, вы можете найти доступные цветовые карты здесь

Пример:

import matplotlib.cm as cm
plt.scatter(x, y, c=t, cmap=cm.jet)

или, альтернативно,

plt.scatter(x, y, c=t, cmap='jet')
Натан
источник
3

Цветовая полоса подзаголовка

Для подзаголовков с разбросом вы можете обмануть цветовую шкалу на своих осях, построив «отображаемую» с помощью вторичной фигуры и затем добавив ее к исходному сюжету.

Как продолжение приведенного выше примера:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = x
t = x
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.scatter(x, y, c=t, cmap='viridis')
ax2.scatter(x, y, c=t, cmap='viridis_r')


# Build your secondary mirror axes:
fig2, (ax3, ax4) = plt.subplots(1, 2)

# Build maps that parallel the color-coded data
# NOTE 1: imshow requires a 2-D array as input
# NOTE 2: You must use the same cmap tag as above for it match
map1 = ax3.imshow(np.stack([t, t]),cmap='viridis')
map2 = ax4.imshow(np.stack([t, t]),cmap='viridis_r')

# Add your maps onto your original figure/axes
fig.colorbar(map1, ax=ax1)
fig.colorbar(map2, ax=ax2)
plt.show()

Части разброса с помощью COLORBAR

Обратите внимание, что вы также выведете вторичную цифру, которую можно игнорировать.

Audelia
источник