matplotlib 平均中位数模式线仅在海运中的最后一个图形中显示

p5fdfcr1  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(120)

我试图在两个图中显示meanmedianmode线,但它们只在最后一个图中可见:

#Cut the window in 2 parts
f, (ax_box, ax_hist) = plt.subplots(2, sharex=True, gridspec_kw={"height_ratios": (0.2, 1)})
#plt.figure(figsize=(10,7));
mean=df[' rating'].mean()
median=df[' rating'].median()
mode=df[' rating'].mode().get_values()[0]
plt.axvline(mean, color='r', linestyle='--')
plt.axvline(median, color='g', linestyle='-')
plt.axvline(mode, color='b', linestyle='-')
plt.legend({'Mean':mean,'Median':median,'Mode':mode})

sns.boxplot(df[" rating"], ax=ax_box)
sns.distplot(df[" rating"], ax=ax_hist)

ax_box.set(xlabel='')
j8ag8udp

j8ag8udp1#

命令plt使用当前轴,而不是所有已定义的轴。要在一个特定的轴上绘制一些东西,你必须告诉matplotlib/seaborn,你指的是哪个轴:

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

df = pd.DataFrame({" rating": [1, 2, 3, 4, 6, 7, 9, 9, 9, 10], "dummy": range(10)})

f, (ax_box, ax_hist) = plt.subplots(2, sharex=True, gridspec_kw= {"height_ratios": (0.2, 1)})
mean=df[' rating'].mean()
median=df[' rating'].median()
mode=df[' rating'].mode().values[0]

sns.boxplot(data=df, x=" rating", ax=ax_box)
ax_box.axvline(mean, color='r', linestyle='--')
ax_box.axvline(median, color='g', linestyle='-')
ax_box.axvline(mode, color='b', linestyle='-')

sns.histplot(data=df, x=" rating", ax=ax_hist, kde=True)
ax_hist.axvline(mean, color='r', linestyle='--', label="Mean")
ax_hist.axvline(median, color='g', linestyle='-', label="Median")
ax_hist.axvline(mode, color='b', linestyle='-', label="Mode")

ax_hist.legend()

ax_box.set(xlabel='')
plt.show()

样本输出:

如果你有一大堆子情节,你可以用一个循环来完成这个任务:

f, bunch_of_axes = plt.subplots(200)
...
for ax in bunch_of_axes:
    ax.axvline(mean, color='r', linestyle='--')
    ax.axvline(median, color='g', linestyle='-')
    ax.axvline(mode, color='b', linestyle='-')

如果没有可用的轴对象(例如,使用pandas打印或类似方法创建地物),可以使用以下方法解决此问题:

....
bunch_of_axes = plt.gcf().axes
for ax in bunch_of_axes:
    ax.axvline(mean, color='r', linestyle='--', label="Mean")
    ....

2021年更新:我更改了pandas代码,因为get_values()现在不推荐使用了。Seaborn也已弃用distplot。可选的是displot,一个没有ax参数的图形级函数,或者histplot,其行为与distplot略有不同。
我已经总结了现在在另一个线程how to emulate the old distplot behavior with histplot .

o2gm4chl

o2gm4chl2#

较短的一个(使用jupyter notebook):

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline
sns.displot(xgb_errors, kde=True, rug=True)
plt.axvline(np.median(xgb_errors),color='b', linestyle='--')

相关问题