seaborn 또는 matplotlib에서 범주 형 산점도 플로팅

Nov 15 2020

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

   it, A   B   C   D
0  10, aa  mn  cd  kk
1  100, ab  cd  wc  ll
2  1000, wc  cd  mn  sf
3  10000, ll  ll  kk  mn
4  100000, wc  kk  mn  cd
5  1000000, aa  ll  we  sf
6  10000000, 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

목표는 y 축이 정렬 된 순서 로 데이터 프레임의 고유 한 값인 산점도를 만드는 것입니다 ( 예 : 옵션 및 a 축이 column에 해당) it. 이제 데이터를 컬럼에 속하는지 여부에 따라 A, B, C,또는 D나는 다른 컬러 스 캐터 점에 원하는 전설을 지정합니다. 그래서 나는 점이 어떤 클래스에서 왔는지 압니다.

seaborn 또는 matplotlib에서 어떻게합니까?

내가 matplotlib에서하는 방식은

iters = list(range(df.shape[0]))
x, y = sort(iters, df["A"])
plt.scatter(x, y, color="red")
x, y = sort(iters, df["B"])
plt.scatter(x, y, color="blue")
...

그러나 전체 y 축을 정렬하지 않고 별도의 열에 속한 레이블 만 정렬합니다.

답변

1 QuangHoang Nov 15 2020 at 10:31

데이터를 쌓고, 지정된 순서로 범주 형으로 변환하고, 정렬하고 플로팅 해 보겠습니다.

s = df.stack() 

s = pd.Series(pd.Categorical(s, categories=options, ordered=True),
              index=s.index)

sns.scatterplot(data=s.sort_values().reset_index(name='value'),
                x='level_0', y='value', hue='level_1'
               )

산출:


업데이트 : 열이 xvalue있고 일부 열만 관리 하는 경우 다음 대신 ['A','B','C','D']사용하십시오 .meltstack

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