【问题标题】:seaborn kdeplot doesn't show when adding vlines添加 vlines 时 seaborn kdeplot 不显示
【发布时间】:2021-09-19 02:26:52
【问题描述】:

我想在 Jupyter 笔记本中为数据集绘制直方图,其中最小值为 ~8e+01,最大值为 6e+07,平均值 ~8e+05,中值 ~1e+05,众数 ~2e +03。我还想在图表中显示集中趋势线。这是我的代码:

plt.figure(figsize=(7,5))
sns.kdeplot(dataset, shade=True)
plt.vlines(x=np.mean(dataset), ymin=0, ymax=1, color='blue', linestyle='--')
plt.vlines(x=np.median(dataset), ymin=0, ymax=1, color='brown', linestyle='--')
plt.vlines(x=scp.mode(dataset)[0][0], ymin=0, ymax=1, color='red', linestyle='--')
plt.legend(['Dataset', 'Mean', 'Median', 'Mode'], fontsize=12)
plt.show()

但是结果图是:

我在网上搜索过,但我找到的所有答案要么是添加我已经完成的plt.show(),要么是添加%matplotlib inline,这仅适用于IPython notebook。我想不出图表无法正确显示数据的另一个原因。

测试数据集:

596819.4
642682.4
619509.33
649141.25
545800.05
572019.8
718330.48
830967.23
742220.67
656892.03
1005603.78
653560.14
657444.04
696281.81
709268.62
924993.61
823623.36
734721.29
783935.36
882754.72
821523.45
800603.23
772926.12
800194.34
850931.58

【问题讨论】:

标签: python matplotlib seaborn


【解决方案1】:
  • 这是因为指定了ymax=1; kdeplot y 轴的最大值为3e-06。密度曲线在那里,只是因为vlines 的比例而看不到。
    • .vlines 要求 yminymax 是轴上的值。
  • 获取 y 刻度的最大值,并将其用作 ymax
  • python 3.8.11matplotlib 3.4.3seaborn 0.11.2中测试
import seaborn as sns
import numpy as np
from scipy.stats import mode
import matplotlib.pyplot as plt

ds = [596819.4, 642682.4, 619509.33, 649141.25, 545800.05, 572019.8, 718330.48, 830967.23, 742220.67, 656892.03, 1005603.78, 653560.14, 657444.04, 696281.81, 709268.62, 924993.61, 823623.36, 734721.29, 783935.36, 882754.72, 821523.45, 800603.23, 772926.12, 800194.34, 850931.58]

p = sns.kdeplot(ds, shade=True, label='Dataset')
ticks = max(p.get_yticks())  # get the max value of the y-ticks
p.vlines(x=np.mean(ds) , ymin=0, ymax=ticks, color='blue', linestyle='--', label='Mean')
p.vlines(x=np.median(ds), ymin=0, ymax=ticks, color='brown', linestyle='--', label='Median')
p.vlines(x=mode(ds)[0][0], ymin=0, ymax=ticks, color='red', linestyle='--', label='Mode')
p.legend(fontsize=12)
plt.show()

  • 正如@JohanC 在评论中指出的那样,使用axvlineyminymax 设置为y 轴的百分比,因此没有必要提取max(p.get_yticks())
p = sns.kdeplot(ds, shade=True, label='Dataset')
p.axvline(x=np.mean(ds) , ymin=0, ymax=1, color='blue', linestyle='--', label='Mean')
p.axvline(x=np.median(ds), ymin=0, ymax=1, color='brown', linestyle='--', label='Median')
p.axvline(x=mode(ds)[0][0], ymin=0, ymax=1, color='red', linestyle='--', label='Mode')
p.legend(fontsize=12)
plt.show()

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 2020-08-31
    • 1970-01-01
    • 2021-05-15
    • 2016-05-25
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多