matplotlib 如何绘制多个x桶不相交箱线图

3okqufwl  于 2023-03-03  发布在  其他
关注(0)|答案(1)|浏览(134)

我想在一个图中绘制几个箱线图。在我的玩具示例中有三个组。组1具有不同大小的值,但应该在图的最左侧。然后组2-3应该附加在x轴上,并在右侧具有y轴。我尝试通过ax.twinx()。但是,这并不完全正确。因为它们不共享完整的x轴。但是x-axis上的顺序很重要,即第1组需要出现在第2组之前,然后是第3组。不幸的是,现在我的第2组与第1组绘制在相同的x位置上。第3组绘制在第2组的x位置上,而不是更靠右

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
df_plot  = pd.DataFrame([[0, 10],[0, 10.1],[0, 9.8],[1, 0.4],[1, 0.2], [1, 0.9], [2, 1.2], [2, 0.2], [2, 1]], columns=["x","y"])
x_ticklable = ["Group 1", "Group 2", "Group 3"]
fig, ax1 = plt.subplots(figsize=(2560/120, 1335/120))
sns.boxplot(data=df_plot[df_plot["x"] <= 0],
            x="x", y="y",
            ax=ax1)
plt.yticks(fontsize=16)
ax2 = ax1.twinx()
sns.boxplot(data=df_plot[df_plot["x"] > 0],
            x="x", y="y",
            ax=ax2)
ax2.set_ylabel("")
ax1.set_ylabel("Y level",
               fontsize="22")
ax1.set_xlabel("Buckets", fontsize="22")
ax1.xaxis.set_ticks(list(range(len(x_ticklable))), fontsize=16)
ax1.set_xticklabels(x_ticklable, fontsize=16)
plt.xticks(fontsize=16)
plt.yticks(fontsize=16)
plt.grid()
plt.show()
plt.close()
hc2pp10m

hc2pp10m1#

对第二个箱线图使用seaborn.boxplot函数的order参数应该可以解决重叠问题。
下面是一个工作示例,它应该可以创建所需的图形

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

df_plot  = pd.DataFrame([[0, 10],[0, 10.1],[0, 9.8],[1, 0.4],[1, 0.2], [1, 0.9], [2, 1.2], [2, 0.2], [2, 1]], columns=["x","y"])
x_ticklabels = ["Group 1", "Group 2", "Group 3"]

fig, ax1 = plt.subplots(figsize=(2560/120, 1335/120))

ax1.set_xlim(0, 2)
# By default, will create a boxplot at position x=0 
sns.boxplot(data=df_plot[df_plot["x"] <= 0], x="x", y="y", ax=ax1) 
plt.yticks(fontsize=16)

ax2 = ax1.twinx()

# Explicitly set the order of the boxplot. 
# Will create a boxplot at position x=1 and x=2 (based on "x" value)
sns.boxplot(data=df_plot[df_plot["x"] > 0], x="x", y="y", ax=ax2, order=[0, 1, 2])

ax1.set_ylabel("Y level", fontsize="22")
ax1.set_xlabel("Buckets", fontsize="22")
ax1.set_xticklabels(x_ticklabels, fontsize=16)

ax1.grid()
ax1.set_axisbelow(True)

plt.xticks(fontsize=16)
plt.yticks(fontsize=16)

相关问题