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']
사용하십시오 .melt
stack
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'
)