Как изобразить цвет как функцию третьей переменной, используя matplotlib.scatter? - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу построить точки с x и y-значениями и раскрасить их в зависимости от соответствующего значения времени. Данные хранятся в Dataframe.

Решением должен быть c -параметр функции scatter matplotlib, но по некоторым причинам она не работает для меня. Временной столбец представляет собой список значений с плавающей запятой в диапазоне от 0 до 3. Построение точек без параметра c работает.

import matplotlib.pyplot as plt

c=list(df_result_local['times'])
for i in range(len(df_result_local['Points'])):
    plt.scatter(df_result_local['Points'][i].x, df_result_local['Points'][i].y, c=c, alpha = 0.5)

Здесь я получаю значение ValueError: аргумент 'c' содержит 1698 элементов,который не приемлем для использования с 'x' с размером 1, 'y' с размером 1.

Ответы [ 3 ]

1 голос
/ 04 ноября 2019

Попробуйте это

import matplotlib.pyplot as plt

c=list(df_result_local['times'])
x = []
y = []
for i in range(len(df_result_local['Points'])):
    x.append(df_result_local['Points'][i].x)
    y.append(df_result_local['Points'][i].y)

plt.scatter(df_result_local['Points'][i].x, df_result_local['Points'][i].y, c=c, alpha = 0.5)
0 голосов
/ 04 ноября 2019

import matplotlib.pyplot, так как plt plt.scatter нужны массивы для x, y и c. Массиву c нужны значения от 0 до 1.

scatter также требуется цветовая карта, например, cmap='viridis' или cmap='Blues'.

Вот упрощенный пример:

c = [0.0, 0.1, 0.2, 1.2, 2.9]
c = [x/3.0 for x in c]  # make sure values are between 0 and 1
points = [(0,1), (1,2), (2.5, 1.5), (0.5, 1.7), (1.1, 1.2) ]
pnt_x = [pnt[0] for pnt in points]
pnt_y = [pnt[1] for pnt in points]

plt.scatter(pnt_x, pnt_y, c=c, cmap='viridis', alpha = 0.5)
plt.show()

Я думаю, что адаптация его к вашему формату и добавление утверждений, чтобы убедиться, что все массивы имеют одинаковую длину, будет выглядеть так:

c = [x/3.0 for x in df_result_local['times'] ]
pnt_x = [pnt.x for pnt in df_result_local['Points']]
pnt_y = [pnt.y for pnt in df_result_local['Points']]

assert len(c) == len(pnt_x), "same number of colors as points needed"
assert len(pnt_x) == len(pnt_y), "same number of x as y coordinates needed"

plt.scatter(pnt_x, pnt_y, c=c, cmap='viridis', alpha = 0.5)

Как отмечено в комментариях, деление надиапазон 0..1 не является строго необходимым. Если вы этого не сделаете, matplotlib нормализует значения. Будьте осторожны с этой автоматической нормализацией, так как она по умолчанию нормализует самое низкое значение до 0, а самое высокое до 1. Если, например, один раз вы строите график только со значениями от 0 до 1,5, и позже вы хотите сравнить с графиком, где у вас есть значенияот 0 до 3, соответствующие точки не будут иметь одинаковый цвет.

0 голосов
/ 04 ноября 2019

Я думаю, вам нужно использовать индекс и на c. Итак

plt.scatter(df_result_local['Points'][i].x, df_result_local['Points'][i].y, c=c[i], alpha = 0.5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...