如何在 Seaborn 中为同一图形的直方图生成两个独立的 Y 轴
How to Generate Two Separate Y-Axes For A Histogram on the Same Figure In Seaborn
我想生成一个具有两个 y 轴的图形:Count
(来自直方图)和 Density
(来自 KDE)。
我想在 Seaborn >= v 0.11
中使用 sns.displot
。
import seaborn as sns
df = sns.load_dataset('tips')
# graph 1: This should be the Y-Axis on the left side of the figure
sns.displot(df['total_bill'], kind='hist', bins=10)
# graph 2: This should be the Y-axis on the right side of the figure
sns.displot(df['total_bill'], kind='kde')
我编写的代码生成了两个独立的图表;我可以只对两个单独的图形使用分面网格,但我想更简洁,将两个单独网格上的两个 y 轴放在一个共享相同 x 轴的图形中。
displot()
是一个figure-level function,它可以在一个图形中创建多个子图。因此,您无法控制单个轴。
要创建组合图,您可以使用底层轴级函数:Seaborn v.0.11 的 histplot()
和 kdeplot()
。这些函数接受一个 ax=
参数。 twinx()
创建第二个 y 轴。
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('tips')
fig, ax = plt.subplots()
sns.histplot(df['total_bill'], bins=10, ax=ax)
ax2 = ax.twinx()
sns.kdeplot(df['total_bill'], ax=ax2)
plt.tight_layout()
plt.show()
编辑:
如评论中所述,y 轴未对齐。左轴仅说明直方图。例如。高度为 68 的最高箱子意味着 12.618
和 17.392
之间正好有 68 张钞票。右轴仅说明有关 kde 的信息。例如。 x=20
的 0.043
的 y 值意味着总帐单在 19.5
和 20.5
之间的概率约为 4.3%。
为了与 sns.histplot(..., kde=True)
类似地对齐两者,可以计算直方图的面积(bin 宽度乘以数据值的数量)并将其用作比例因子。当以像素为单位测量时,这种缩放会使直方图的面积和 kde 曲线下方的面积相等:
num_bins = 10
bin_width = (df['total_bill'].max() - df['total_bill'].min()) / num_bins
hist_area = len(df) * bin_width
ax2.set_ylim(ymax=ax.get_ylim()[1] / hist_area)
请注意,如果直方图使用 bin 宽度的 10 次幂(例如 sns.histplot(..., bins=np.arange(0, df['total_bill'].max()+10, 10)
),则右轴将更类似于百分比。哪些 bin 最合适在很大程度上取决于您要如何解释数据。
我想生成一个具有两个 y 轴的图形:Count
(来自直方图)和 Density
(来自 KDE)。
我想在 Seaborn >= v 0.11
中使用 sns.displot
。
import seaborn as sns
df = sns.load_dataset('tips')
# graph 1: This should be the Y-Axis on the left side of the figure
sns.displot(df['total_bill'], kind='hist', bins=10)
# graph 2: This should be the Y-axis on the right side of the figure
sns.displot(df['total_bill'], kind='kde')
我编写的代码生成了两个独立的图表;我可以只对两个单独的图形使用分面网格,但我想更简洁,将两个单独网格上的两个 y 轴放在一个共享相同 x 轴的图形中。
displot()
是一个figure-level function,它可以在一个图形中创建多个子图。因此,您无法控制单个轴。
要创建组合图,您可以使用底层轴级函数:Seaborn v.0.11 的 histplot()
和 kdeplot()
。这些函数接受一个 ax=
参数。 twinx()
创建第二个 y 轴。
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('tips')
fig, ax = plt.subplots()
sns.histplot(df['total_bill'], bins=10, ax=ax)
ax2 = ax.twinx()
sns.kdeplot(df['total_bill'], ax=ax2)
plt.tight_layout()
plt.show()
编辑:
如评论中所述,y 轴未对齐。左轴仅说明直方图。例如。高度为 68 的最高箱子意味着 12.618
和 17.392
之间正好有 68 张钞票。右轴仅说明有关 kde 的信息。例如。 x=20
的 0.043
的 y 值意味着总帐单在 19.5
和 20.5
之间的概率约为 4.3%。
为了与 sns.histplot(..., kde=True)
类似地对齐两者,可以计算直方图的面积(bin 宽度乘以数据值的数量)并将其用作比例因子。当以像素为单位测量时,这种缩放会使直方图的面积和 kde 曲线下方的面积相等:
num_bins = 10
bin_width = (df['total_bill'].max() - df['total_bill'].min()) / num_bins
hist_area = len(df) * bin_width
ax2.set_ylim(ymax=ax.get_ylim()[1] / hist_area)
请注意,如果直方图使用 bin 宽度的 10 次幂(例如 sns.histplot(..., bins=np.arange(0, df['total_bill'].max()+10, 10)
),则右轴将更类似于百分比。哪些 bin 最合适在很大程度上取决于您要如何解释数据。