Seaborn 산점도에서 다른 마커, 크기, 테두리 및 불투명도 할당

Nov 15 2020

다음 데이터 프레임이 있습니다.

   xvalue, A   B   C   D
0  10, aa  mn  cd  kk
1  20, ab  cd  wc  ll
2  30, wc  cd  mn  sf
3  40, ll  ll  kk  mn
4  50, wc  kk  mn  cd
5  60, aa  ll  we  sf
6  70, ss  aa  ss  kk

그것을 만드는 코드

options = ["ab", "cd", "bb", "aa", "we", "ss", "kk", "mn", "re", "wc", "ll", "sf"]
df = pd.DataFrame(columns=["A", "B", "C", "D"])
for i, it in enumerate([1,2,3,4,5,6,7]):
    row = [10*i, random.sample(options, 1)[0], random.sample(options, 1)[0], 
           random.sample(options, 1)[0], random.sample(options, 1)[0]]
    df.loc[i] = row

그리고 플로팅이 완료되었습니다.

s = df.melt(id_vars='xvalue', 
            value_vars=['A','B','C','D'],
            value_name='value',
            var_name='column')
s['value'] = pd.Categorical(s['value'], categories=options, ordered=True)

sns.scatterplot(data=s.sort_values('value'), x='xvalue', y='value', hue='column')

이제 질문 - 내가 다른 클래스에 속하는 캐터 점에 다른 스타일을 할당 할 방법 (예를 들어, 컬럼에 의해 정의 A, B, C, D). 예를 들어, 클래스 A는 마커 "P", B는 마커 "p", C는 마커 "v"가되고 싶습니다. 알파 (불투명도), 테두리 선, 색상 지정 등을 정의하고 싶습니다.

matplotlib에서 나는 할 것이다

plt.scatter(x, y, color="blue", label="A", alpha=0.8, s=80, marker="p")

그러나 이는 자체 매개 변수를 사용하여 그래프에 다른 플롯을 명시 적으로 생성합니다. 지금은 "한 줄거리"내에서 다른 클래스를 다루는 방법을 모르겠습니다.

나는 또한 시도했다

markers = {"A": "s", "B": "X", "C": "p", "D":"o"}
sns.scatterplot(data=s.sort_values('value'), x='xvalue', y='value', hue='column', markers=markers)

하지만 효과가 없었습니다.

편집 : 다른 마커를 적용하려면 style = "column"을 지정해야하지만 시도하면

sizes = {"A":100, "B": 120, "C": 150, "D":200}
sns.scatterplot(data=s.sort_values('value'), x='xvalue', y='value', hue='column', markers=markers, s=sizes)

작동하지 않습니다

답변

1 QuangHoang Nov 15 2020 at 16:58

또 다른 방법은 문자열 / 값을 options열거 형 으로 바꾸는 것입니다 .

opt_dict = {opt:i for i,opt in enumerate(options)}

markers = {"A": "s", "B": "X", "C": "p", "D":"o"}
sizes = {"A":100, "B": 120, "C": 150, "D":200}
alphas = {'A':0.2, 'B':0.3, 'C':0.6, 'D':0.8}
col_list = ['A','B','C','D']

fig, ax = plt.subplots(figsize=(9,6))
for col in col_list:
    ax.scatter(df['xvalue'], df[col].map(opt_dict), 
               marker=markers[col],
               s=sizes[col],
               alpha=alphas[col],
               label=col)
    
ax.set_yticks(range(len(options)))
ax.set_yticklabels(options)
ax.legend()

산출: