programing

여러 범주형 수준에 대해 다른 색 그림 표시

linuxpc 2023. 9. 13. 22:22
반응형

여러 범주형 수준에 대해 다른 색 그림 표시

이 데이터 프레임을 가지고 있습니다.diamonds은로된과된로e은과 같은 .(carat, price, color), 를 는 의 산점도를 그리고 .pricecarat ③에 color은 달라요, 입니다 은 입니다 은 color그림의 색이 다릅니다.

이것은 쉬운 일입니다.R와 함께ggplot:

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)

enter image description here

어떻게 파이썬에서 이것을 할 수 있는지 궁금합니다.matplotlib?

PS:

나는 보조적인 계획 패키지에 대해 알고 있습니다.seaborn그리고.ggplot for python, 저는 그들을 선호하지 않아요, 단지 그 일이 가능한지 알고 싶어요.matplotlibP;,;P

데이터 프레임 가져오기 및 샘플

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns  # for sample data
from matplotlib.lines import Line2D  # for legend handle

# DataFrame used for all options
df = sns.load_dataset('diamonds')

   carat      cut color clarity  depth  table  price     x     y     z
0   0.23    Ideal     E     SI2   61.5   55.0    326  3.95  3.98  2.43
1   0.21  Premium     E     SI1   59.8   61.0    326  3.89  3.84  2.31
2   0.23     Good     E     VS1   56.9   65.0    327  4.05  4.07  2.31

와 함께matplotlib

당신은 통과할 수.c색상을 선택할 수 있는 인수.음는를 a합니다를 합니다.colors다이아몬드 색상을 플롯팅 색상에 매핑하는 사전.

fig, ax = plt.subplots(figsize=(6, 6))

colors = {'D':'tab:blue', 'E':'tab:orange', 'F':'tab:green', 'G':'tab:red', 'H':'tab:purple', 'I':'tab:brown', 'J':'tab:pink'}

ax.scatter(df['carat'], df['price'], c=df['color'].map(colors))

# add a legend
handles = [Line2D([0], [0], marker='o', color='w', markerfacecolor=v, label=k, markersize=8) for k, v in colors.items()]
ax.legend(title='color', handles=handles, bbox_to_anchor=(1.05, 1), loc='upper left')

plt.show()

df['color'].map(colors)효과적으로 색상을 "diamond"에서 "plotting"로 매핑합니다.

(다른 예시 이미지를 올리지 못한 점 양해 부탁드립니다 :P)

와 함께seaborn

을 사용할 수 .seaborn그것은 포장지 주위에 있습니다.matplotlib기본적으로 더 예뻐 보이게 만들지만(오피니언 기반으로 알고 있습니다 :P) 플롯 기능도 추가됩니다.

이를 위해 사용할 수 있습니다.fit_reg=False(이를 통해 자동으로 일부 회귀 작업을 수행할 수 없습니다.)

  • sns.scatterplot(x='carat', y='price', data=df, hue='color', ec=None)같은 일을 합니다.

hue='color'에게 seavorn의 하도록 지시합니다.'color'기둥.

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

enter image description here

With &

Seaborn을 Seaborn을 하세요.pandas.groupby색상을 단독으로 가져온 다음 매트플롯립만 사용하여 플롯을 표시하지만, 진행하면서 색상을 수동으로 할당해야 합니다. 아래 예를 추가했습니다.

fig, ax = plt.subplots(figsize=(6, 6))

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이을 반복해서 각각의 그룹에 플롯을 합니다. 그런 다음 각 그룹에 대해 플롯을 그리며 이 그룹을 반복합니다.,a를 colors색상을 수 :드을할수는전예(전예는:드n을r수 :D으로 (를 들어 ) 으로 를 ( )tab:blue).

enter image description here

여기 바다본 컬러 팔레트를 사용하는 간결하고 포괄적인 솔루션이 있습니다.

먼저 마음에 드는 색상 팔레트를 찾고 원하는 대로 시각화합니다.

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

저도 같은 질문을 받고 하루 종일 여러 가지 패키지를 시험해 보았습니다.

저는 원래 matlib plot을 사용했습니다: 그리고 카테고리를 미리 정의된 색상에 매핑하는 것, 또는 그룹화/집계하는 것 중 하나에 만족하지 않았습니다. 그리고 여전히 색상을 매핑해야 합니다.저는 단지 불량한 패키지 구현이라고 느꼈습니다.

Seaborn은 내 케이스를 처리하지 않고 Altair는 Jupyter 노트북 안에서만 작동합니다.

저에게 가장 좋은 해결책은 플롯나인이었는데, 플롯나인은 "파이썬에서 그래픽의 문법을 구현하고 ggplot2를 기반으로 한다"는 것입니다.

아래는 Python에서 당신의 R 예제를 복제하기 위한 plotnine 코드입니다.

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 diamonds example

깔끔하고 심플해요 :)

여기 정성적인 컬러맵의 마커와 컬러의 조합이 있습니다.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);

enter image description here

가장 쉬운 방법은 단순히 정수 범주 수준의 배열을 전달하는 것입니다.plt.scatter()color parameter.

import pandas as pd
import matplotlib.pyplot as plt 

df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/diamonds.csv')

plt.scatter(df['carat'], df['price'], c=pd.factorize(df['color'])[0],)
plt.gca().set(xlabel='Carat', ylabel='Price', title='Carat vs. Price')

enter image description here

이렇게 하면 기본 "viridis" 색상 맵을 사용하여 범례가 없는 플롯을 만듭니다.이 경우 "viridis"는 단순히 명목상의 범주가 아닌 순차적인 순서를 의미하는 것처럼 보이기 때문에 기본적으로 선택하는 것이 좋지 않습니다.

색상 지도를 직접 선택하고 범례를 추가하는 가장 간단한 방법은 다음과 같습니다.

import matplotlib.patches

levels, categories = pd.factorize(df['color'])
colors = [plt.cm.tab10(i) for i in levels] # using the "tab10" colormap
handles = [matplotlib.patches.Patch(color=plt.cm.tab10(i), label=c) for i, c in enumerate(categories)]

plt.scatter(df['carat'], df['price'], c=colors)
plt.gca().set(xlabel='Carat', ylabel='Price', title='Carat vs. Price')
plt.legend(handles=handles,  title='Color')

enter image description here

여기서 "tab10" 이산(정성적) 색상 지도를 선택했는데, 색상 인자가 명목 범주형 변수임을 더 잘 나타냅니다.

추가 크레딧:
첫 번째 그림에서는 범주 수준 int 배열에서 최소-최대 축척 값을 전달하여 기본 색상을 선택합니다.pd.factorize(iris['species'])[0]호출 방식으로plt.cm.viridis색상 지도 객체

알테어로.

from altair import *
import pandas as pd

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

enter image description here

df.plot() 포함

일반적으로 DataFrame을 빠르게 플롯할 때는pd.DataFrame.plot(). 그러면 인덱스를 x 값으로, 값을 y 값으로 사용하고 각 열을 다른 색으로 별도로 표시합니다.이 형태의 데이터 프레임은 다음을 사용하여 달성할 수 있습니다.set_index그리고.unstack.

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

plot

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

이 절차는 다른 데이터 시리즈에 더 적합할 수 있습니다.저의 경우 시계열 데이터를 가지고 있기 때문에 MultiIndex는 날짜 시간과 범주로 구성됩니다.두 개 이상의 열에 대해 이 방법을 사용하여 색을 칠하는 것도 가능하지만 범례는 엉망이 되고 있습니다.

다음 명령을 사용하여 범주형 열을 숫자 열로 변환할 수 있습니다.

#we converting it into categorical data
cat_col = df['column_name'].astype('category') 

#we are getting codes for it 
cat_col = cat_col.cat.codes 

# we are using c parameter to change the color.
plt.scatter(df['column1'],df['column2'], c=cat_col) 

언급URL : https://stackoverflow.com/questions/26139423/plot-different-color-for-different-categorical-levels

반응형