Раскрашиваем диаграмму рассеяния из pandas чисел? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть фрейм данных с координатами в одном столбце и ориентацией в другом:

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

Я пытаюсь разбросать координаты, а затем раскрасить их по их ориентации:

for row in df.itertuples():
   x, y = row.coords[:,1], row.coords[:,0]
   plt.scatter(x,y, c=df.orientation)

Это хорошо отображает координаты, но не ориентацию, поскольку она все еще находится в пределах одной л oop. Кто-нибудь знает, как обойти эту проблему?

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Поскольку каждая строка имеет только один цвет, вам необходимо явно установить этот цвет для строки. Чтобы получить цвет из определенного значения ориентации numeri c, вам необходимо создать цветовую карту и норму. Цветовая карта может быть любой по вашему выбору. Норма должна быть установлена ​​с использованием всего диапазона столбца «ориентация». Используя норму (чтобы получить значение от 0 до 1), вы можете проиндексировать цветовую карту и получить значение rgb.

As plt.scatter пытается проверить, даете ли вы один цвет для всех точек вместе или один цвет на точку, значения rgb могут вызвать путаницу. Поэтому безопаснее всего создать массив вокруг значения цвета (т.е. c=[cmap(norm(row.orientation))] вместо c=cmap(norm(row.orientation))).

Цветовая карта и норма также могут использоваться для создания сопутствующей цветовой шкалы.

Вот пример кода для начала:

from matplotlib import pyplot as plt
from matplotlib.cm import ScalarMappable
import numpy as np
import pandas as pd

N = 30
df = pd.DataFrame({'coords': [np.random.normal(0, 1, size=(np.random.randint(5, 50), 2)) + np.random.uniform(0, 50, 2)
                              for _ in range(N)],
                   'orientation': np.random.uniform(-1, 1, N)})
cmap = plt.get_cmap('magma')
norm = plt.Normalize(df.orientation.min(), df.orientation.max())
for row in df.itertuples():
    coords = np.array(row.coords)
    x, y = coords[:, 1], coords[:, 0]
    plt.scatter(x, y, c=[cmap(norm(row.orientation))])
plt.colorbar(ScalarMappable(cmap=cmap, norm=norm), label='orientation')
plt.show()

пример сюжета

0 голосов
/ 20 июня 2020

Вы выполняете итерацию по строкам, поэтому следует использовать тот же синтаксис, что и для x и y: c=row.orientation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...