我按照被接受的答案操作,但当我想要覆盖使用其他y轴的第二个图时(即
ax.twinx()
),遇到了一些复杂问题。问题在于第二个图的x轴覆盖了排序顺序。
最终,我只使用了
seaborn
来完成以下操作。这类似于@rocksNwaves的答案,但我使用了问题中介绍的术语。只需三个步骤:
If you don't mind creating a column that combines "X" and "Y", it will make things easier with seaborn:
df["XY"] = df["X"] + df["Y"]
Of course, you can combine the two columns in however way you want.
Order by XY and obtain sorted index
grouped = df.groupby(["XY"])
order = grouped.median()["Z"].sort_values().index
Plot using seaborn
sns.boxplot(x="XY", y="Z", data=df, order=order)
Note that you can think of order
as specifying the order of labels on the x axis.
一个完整的程序:
import pandas as pd
import random
import seaborn as sns
import matplotlib.pyplot as plt
n = 100
df = pd.DataFrame({"X": [random.choice(["A","B","C"]) for i in range(n)],
"Y": [random.choice(["a","b","c"]) for i in range(n)],
"Z": [random.gauss(0,1) for i in range(n)]})
df["XY"] = df["X"] + df["Y"]
grouped = df.groupby(["XY"])
order = grouped.median()["Z"].sort_values().index
sns.boxplot(x="XY", y="Z", data=df, order=order, palette="light:#5A9")
plt.show()
df
looks like
X Y Z
0 A a 0.894873
1 C a -0.568682
2 C b 0.985260
3 B c 2.056287
...
情节看起来像
![enter image description here](https://istack.dev59.com/BDZnW.webp)
meds.sort(ascending = False)
更改为meds.sort_values(ascending = False,inplace = True)
。 - Stephen McAteer