Saya ingin membuat plot di mana titik-titik dilapis tergantung pada apakah mereka berada dalam kuartil 1-3 di seaborn atau tidak. Fungsi apa yang harus digunakan?

Sesuatu yang mirip dengan gambar:

enter image description here

0
Sos 6 Juli 2020, 12:33

1 menjawab

Jawaban Terbaik

Kode berikut membuat Seaborn swarmplot dan kemudian mewarnai ulang titik-titik tergantung pada kuartilnya. Looping melalui koleksi yang dibuat oleh swarmplot, y-data diambil. np.percentile menghitung batas kuartil dan np.digitize menghitung kuartil yang sesuai. Kuartil ini dapat digunakan untuk menentukan warna.

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from matplotlib.colors import ListedColormap

sns.set(style="whitegrid")
tips = sns.load_dataset("tips")

# cmap = plt.get_cmap('tab10')
cmap = ListedColormap(['gold', 'crimson', 'teal', 'orange'])
ax = sns.swarmplot(x="day", y="total_bill", data=tips)
for col in ax.collections:
    y = col.get_offsets()[:,1]
    perc = np.percentile(y, [25, 50, 75])
    col.set_cmap(cmap)
    col.set_array(np.digitize(y, perc))
plt.show()

resulting plot

Pendekatan yang sama dapat digunakan untuk stripplot (opsional tanpa jitter) untuk membuat plot yang mirip dengan yang ada di pertanyaan.

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from matplotlib.colors import ListedColormap

sns.set(style="whitegrid")
N = 200
x = np.repeat(list('abcdefg'), N)
y = np.random.normal(np.repeat(np.random.uniform(11, 15, 7), N), 1)

cmap = ListedColormap(['grey', 'turquoise', 'grey'])
ax = sns.stripplot(x=x, y=y, jitter=False, alpha=0.2)
for col in ax.collections:
    y = col.get_offsets()[:, 1]
    perc = np.percentile(y, [25, 75])
    col.set_cmap(cmap)
    col.set_array(np.digitize(y, perc))
plt.show()

stripplot example

1
JohanC 6 Juli 2020, 11:32