[matplotlib] matplotlib를 사용하여 다양한 범주 수준에 대해 다른 색을 플로팅합니다.

나는 diamonds같은 변수로 구성된 이 데이터 프레임 을 가지고 있으며 각 에 대한 (carat, price, color)산점도를 그리려고합니다. 즉 , 플롯에서 다른 색상 이 있음을 의미 합니다.pricecaratcolorcolor

이것은 다음 Rggplot같이 쉽습니다 .

ggplot(aes(x=carat, y=price, color=color),  #by setting color=color, ggplot automatically draw in different colors
       data=diamonds) + geom_point(stat='summary', fun.y=median)

여기에 이미지 설명 입력

나는 이것을 사용하여 파이썬에서 어떻게 할 수 있는지 궁금합니다 matplotlib.

추신:

seaborn및과 같은 보조 플로팅 패키지에 대해 알고 있지만 ggplot for python선호하지 않습니다 matplotlib.; P를 사용하여 작업을 수행 할 수 있는지 확인하고 싶습니다 .



답변

색상을 선택할 수 plt.scatter있는 c인수를 전달할 수 있습니다 . 아래 코드는 colors다이아몬드 색상을 플로팅 색상에 매핑 하는 사전을 정의합니다 .

import matplotlib.pyplot as plt
import pandas as pd

carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30]
price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600]
color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',]

df = pd.DataFrame(dict(carat=carat, price=price, color=color))

fig, ax = plt.subplots()

colors = {'D':'red', 'E':'blue', 'F':'green', 'G':'black'}

ax.scatter(df['carat'], df['price'], c=df['color'].apply(lambda x: colors[x]))

plt.show()

df['color'].apply(lambda x: colors[x]) “다이아몬드”에서 “플로팅”으로 색상을 효과적으로 매핑합니다.

(다른 예제 이미지를 올리지 않은 것에 대해 용서하십시오. 2면 충분하다고 생각합니다. : P)

seaborn

기본적으로 더 예쁘게 보이게 만드는 seaborn래퍼를 사용할 수 있지만 matplotlib(오피니언 기반, 나는 알고 있습니다 : P) 일부 플로팅 기능도 추가합니다.

이를 위해 seaborn.lmplot함께 사용할 수 있습니다 fit_reg=False(이는 일부 회귀를 자동으로 수행하는 것을 방지합니다).

아래 코드는 예시 데이터 세트를 사용합니다. 선택 hue='color'하면 seaborn에게 색상을 기준으로 데이터 프레임을 분할 한 다음 각각을 플로팅하도록 지시합니다.

import matplotlib.pyplot as plt
import seaborn as sns

import pandas as pd

carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30]
price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600]
color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',]

df = pd.DataFrame(dict(carat=carat, price=price, color=color))

sns.lmplot('carat', 'price', data=df, hue='color', fit_reg=False)

plt.show()

여기에 이미지 설명 입력

seaborn사용 하지 않고pandas.groupby

seaborn을 사용하지 않으려면 pandas.groupby색상 만 가져온 다음 matplotlib를 사용하여 플로팅 할 수 있지만 이동하면서 수동으로 색상을 할당해야합니다. 아래 예제를 추가했습니다.

fig, ax = plt.subplots()

colors = {'D':'red', 'E':'blue', 'F':'green', 'G':'black'}

grouped = df.groupby('color')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='carat', y='price', label=key, color=colors[key])

plt.show()

이 코드는 위와 동일한 DataFrame을 가정하고 color. 그런 다음 이러한 그룹을 반복하여 각 그룹에 대해 플로팅합니다. 색상을 선택하기 colors위해 다이아몬드 색상 (예 D:)을 실제 색상 ( 예 :)에 매핑 할 수 있는 사전을 만들었습니다 red.

여기에 이미지 설명 입력


답변

다음은 seaborn 색상 팔레트를 사용하는 간결하고 일반적인 솔루션입니다.

먼저 원하는 색상 팔레트찾아 선택적으로 시각화하십시오.

sns.palplot(sns.color_palette("Set2", 8))

그런 다음 다음과 같이 사용할 수 있습니다 matplotlib.

# Unique category labels: 'D', 'F', 'G', ...
color_labels = df['color'].unique()

# List of RGB triplets
rgb_values = sns.color_palette("Set2", 8)

# Map label to RGB
color_map = dict(zip(color_labels, rgb_values))

# Finally use the mapped values
plt.scatter(df['carat'], df['price'], c=df['color'].map(color_map))


답변

나는 같은 질문이 있었고 하루 종일 다른 패키지를 시험해 보았습니다.

저는 원래 matlibplot을 사용했습니다 : 그리고 미리 정의 된 색상에 대한 범주 매핑에 만족하지 않았습니다. 또는 그룹화 / 집계 한 다음 그룹을 반복합니다 (그리고 여전히 색상을 매핑해야 함). 패키지 구현이 좋지 않다고 느꼈습니다.

Seaborn은 내 케이스에서 작동하지 않으며 Altair는 Jupyter Notebook 내부에서만 작동합니다.

저에게 가장 적합한 솔루션은 PlotNine이었습니다. “Python에서 그래픽 문법을 구현 한 ggplot2 기반”입니다.

다음은 Python에서 R 예제를 복제하는 플롯 나인 코드입니다.

from plotnine import *
from plotnine.data import diamonds

g = ggplot(diamonds, aes(x='carat', y='price', color='color')) + geom_point(stat='summary')
print(g)

plotnine 다이아몬드 예

너무 깨끗하고 간단합니다 🙂


답변

Altair 사용 .

from altair import *
import pandas as pd

df = datasets.load_dataset('iris')
Chart(df).mark_point().encode(x='petalLength',y='sepalLength', color='species')

여기에 이미지 설명 입력


답변

다음은 정 성적 컬러 맵의 마커와 색상 조합입니다 matplotlib.

import itertools
import numpy as np
from matplotlib import markers
import matplotlib.pyplot as plt

m_styles = markers.MarkerStyle.markers
N = 60
colormap = plt.cm.Dark2.colors  # Qualitative colormap
for i, (marker, color) in zip(range(N), itertools.product(m_styles, colormap)):
    plt.scatter(*np.random.random(2), color=color, marker=marker, label=i)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0., ncol=4);

여기에 이미지 설명 입력


답변

df.plot () 사용

일반적으로 DataFrame을 빠르게 플로팅 할 때 pd.DataFrame.plot(). 인덱스를 x 값으로, 값을 y 값으로 취하고 각 열을 다른 색상으로 개별적으로 플로팅합니다. 이 형태의 DataFrame을 사용하여 달성 될 수 set_indexunstack.

import matplotlib.pyplot as plt
import pandas as pd

carat = [5, 10, 20, 30, 5, 10, 20, 30, 5, 10, 20, 30]
price = [100, 100, 200, 200, 300, 300, 400, 400, 500, 500, 600, 600]
color =['D', 'D', 'D', 'E', 'E', 'E', 'F', 'F', 'F', 'G', 'G', 'G',]

df = pd.DataFrame(dict(carat=carat, price=price, color=color))

df.set_index(['color', 'carat']).unstack('color')['price'].plot(style='o')
plt.ylabel('price')

음모

이 방법을 사용하면 색상을 수동으로 지정할 필요가 없습니다.

이 절차는 다른 데이터 시리즈에 더 적합 할 수 있습니다. 제 경우에는 timeseries 데이터가 있으므로 MultiIndex는 datetime과 범주로 구성됩니다. 하나 이상의 열에 색상을 지정하는 데이 방법을 사용할 수도 있지만 범례가 엉망이되고 있습니다.


답변

저는 보통 matplotlib 위에 구축 된 Seaborn을 사용하여합니다.

import seaborn as sns
iris = sns.load_dataset('iris')
sns.scatterplot(x='sepal_length', y='sepal_width',
              hue='species', data=iris);