IT박스

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

itboxs 2020. 10. 21. 07:49
반응형

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


I는이 데이터 프레임이 diamonds같은 변수로 구성되고 (carat, price, color), 난의 산점도 그리려 pricecarat각각 color다른 수단, color플롯 다른 컬러를 가진다.

이것은 다음 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, 난 그냥 사용하여 일을 할 수 있는지 확인하려면,을 선호하는이 donot 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))

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);

여기에 이미지 설명 입력


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

저는 원래 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 다이아몬드 예

너무 깨끗하고 간단합니다 :)


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

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

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과 범주로 구성됩니다. 하나 이상의 열에 색상을 지정하는 데이 방법을 사용할 수도 있지만 범례가 엉망이되고 있습니다.

참고 URL : https://stackoverflow.com/questions/26139423/plot-different-color-for-different-categorical-levels-using-matplotlib

반응형