Есть ли способ сделать matplotlib точечным маркером или цветом в соответствии с дискретной переменной в другом столбце?

#python #matplotlib #pandas #scatter

#python #matplotlib #панды #разброс

Вопрос:

Я создаю диаграммы рассеяния из DF, используя matplotlib. Чтобы получить разные цвета для каждого набора данных, я делаю два отдельных вызова plt.scatter:

 plt.scatter(zzz['HFmV'], zzz['LFmV'], label = dut_groups[0], color = 'r' )
plt.scatter(qqq['HFmV'], qqq['LFmV'], label = dut_groups[1], color = 'b' )
plt.legend()
plt.show()
 

Это дает мне желаемую цветовую зависимость, но на самом деле было бы идеально, если бы я мог просто заставить pandas предоставить мне диаграмму рассеяния с несколькими наборами данных на одном графике чем-то вроде

df.plot(kind = scatter(x, y, color = df.Group, marker = df.Head)

По-видимому, такого животного нет (по крайней мере, я смог найти). Итак, следующим лучшим решением, на мой взгляд, было бы поместить вызовы plt.scatter в цикл, где я мог бы изменить цвет или маркер в зависимости от одной из строк (не x или y, а какой-то другой строки. Если строка, которую я хочу использовать, была непрерывной переменной, похоже, я мог бы использовать цветовую карту, но в моем случае строка, которую мне нужно подать в суд на это, является строкой (категориальный тип переменной, а не число).

Любая помощь приветствуется.

Ответ №1:

То, что вы делаете, почти сработает, но вам нужно передать color вектор цветов, а не только вектор переменных. Итак, вы могли бы сделать:

 color = df.Group.map({dut_groups[0]: "r", dut_groups[1]: "b"})
plt.scatter(x, y, color=color)
 

То же самое касается стиля маркера

Вы также можете использовать seaborn для отображения цветов так, как вы ожидаете (как обсуждалось здесь ), хотя он не выполняет отображение стиля маркера:

 import seaborn as sns
import pandas as pd
from numpy.random import randn

data = pd.DataFrame(dict(x=randn(40), y=randn(40), g=["a", "b"] * 20))
sns.lmplot("x", "y", hue="g", data=data, fit_reg=False)
 

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