나는 diamonds
같은 변수로 구성된 이 데이터 프레임 을 가지고 있으며 각 에 대한 (carat, price, color)
산점도를 그리려고합니다. 즉 , 플롯에서 다른 색상 이 있음을 의미 합니다.price
carat
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)
나는 이것을 사용하여 파이썬에서 어떻게 할 수 있는지 궁금합니다 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)
너무 깨끗하고 간단합니다 🙂
답변
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_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')
이 방법을 사용하면 색상을 수동으로 지정할 필요가 없습니다.
이 절차는 다른 데이터 시리즈에 더 적합 할 수 있습니다. 제 경우에는 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);
