พล็อต scatterplot ในทะเลหรือ matplotlib

Nov 15 2020

ฉันมี dataframe ต่อไปนี้

   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

เป้าหมายคือการสร้าง scatterplot ที่แกน Y เป็นค่าที่ไม่ซ้ำกันจาก dataframe ในเรียงลำดับitตัวเลือกเช่นและสอดคล้องกับคอลัมน์แกน ตอนนี้ขึ้นอยู่กับว่าข้อมูลเป็นของคอลัมน์A, B, C,หรือDฉันต้องการให้จุดกระจายสีแตกต่างกันและระบุคำอธิบายแผนภูมิ ฉันรู้ว่าจุดมาจากคลาสอะไร

ฉันจะทำมันในทะเลบอร์นหรือแมตพล็อตลิบได้อย่างไร?

วิธีที่ฉันทำใน 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'
               )