matplotlib 如何求海运ecdf图轴线交点x值?

72qzrwbm  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(186)

我有一个这样的ecdf图:

penguins = sns.load_dataset("penguins")
fig, ax = plt.subplots(figsize = (10,8))
sns.ecdfplot(data=penguins, x="bill_length_mm", hue="species")
ax.axhline(.25, linestyle = '--', color ='#cfcfcf', lw = 2, alpha = 0.75)

如何求这条相交轴线上的x值?

2ic8powd

2ic8powd1#

您可以循环遍历生成的曲线(ax.get_lines()),提取它们的坐标并搜索第一个大于所需y值的y值的索引。
下面是一些示例代码(注意,sns.ecdfplot()应获取ax作为参数):

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

penguins = sns.load_dataset("penguins")
fig, ax = plt.subplots(figsize=(10, 8))
sns.ecdfplot(data=penguins, x="bill_length_mm", hue="species", ax=ax)
y_special = 0.25
for line in ax.get_lines():
    x, y = line.get_data()
    ind = np.argwhere(y >= y_special)[0, 0]  # first index where y is larger than y_special
    # x[ind] is the desired x-value
    ax.text(x[ind], y_special, f' {x[ind]:.1f}', ha='left', va='top') # maybe color=line.get_color()
ax.axhline(y_special, linestyle='--', color='#cfcfcf', lw=2, alpha=0.75)
plt.show()

PS:您可以选择将这些x值添加到图例中:

for line, legend_text in zip(ax.get_lines(), ax.legend_.get_texts()):
    x, y = line.get_data()
    ind = np.argwhere(y >= y_special)[0, 0]
    legend_text.set_text(f'{x[ind]:5.2f} {legend_text.get_text()}')
35g0bw71

35g0bw712#

在这种情况下,最好使用Pandas提供的计算工具,而不是试图从视觉表征中得出定量值。
如果要获得与每个物种的0.25分位数对应的值,应执行以下操作:

penguins.groupby("species")["bill_length_mm"].quantile(.25)

其返回

species
Adelie       36.75
Chinstrap    46.35
Gentoo       45.30
Name: bill_length_mm, dtype: float64

相关问题