0

我正在尝试使用基于此 MIC(1) 线的阴影创建绘图。上面和下面不同的阴影。

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

def createSkewDist(mean, sd, skew, size):

    # calculate the degrees of freedom 1 required to obtain the specific skewness statistic, derived from simulations
    loglog_slope=-2.211897875506251 
    loglog_intercept=1.002555437670879 
    df2=500
    df1 = 10**(loglog_slope*np.log10(abs(skew)) + loglog_intercept)

    # sample from F distribution
    fsample = np.sort(stats.f(df1, df2).rvs(size=size))

    # adjust the variance by scaling the distance from each point to the distribution mean by a constant, derived from simulations
    k1_slope = 0.5670830069364579
    k1_intercept = -0.09239985798819927
    k2_slope = 0.5823114978219056
    k2_intercept = -0.11748300123471256

    scaling_slope = abs(skew)*k1_slope + k1_intercept
    scaling_intercept = abs(skew)*k2_slope + k2_intercept

    scale_factor = (sd - scaling_intercept)/scaling_slope    
    new_dist = (fsample - np.mean(fsample))*scale_factor + fsample

    # flip the distribution if specified skew is negative
    if skew < 0:
        new_dist = np.mean(new_dist) - new_dist

    # adjust the distribution mean to the specified value
    final_dist = new_dist + (mean - np.mean(new_dist))

    return final_dist



desired_mean = 30
desired_skew = 1.5
desired_sd = 20

final_dist = createSkewDist(mean=desired_mean, sd=desired_sd, skew=desired_skew, size=1000000)

# inspect the plots & moments, try random sample
fig, ax = plt.subplots(figsize=(12,7))
sns.distplot(final_dist, 
             hist=False, 
             ax=ax, 
             color='darkred', 
             kde_kws=dict(linewidth=4))

l1 = ax.lines[0]


# Get the xy data from the lines so that we can shade
x1 = l1.get_xydata()[:,0]
x1[0] = 0

y1 = l1.get_xydata()[:,1]
y1[0] = 0

ax.fill_between(x1,y1, color="lemonchiffon", alpha=0.3)


ax.set_ylim(0.0001,0.03)
ax.axhline(0.002, ls="--")
ax.set_xlim(1.5, 200)
ax.set_yticklabels([])
ax.set_xticklabels([])


trans = transforms.blended_transform_factory(
    ax.get_yticklabels()[0].get_transform(), ax.transData)

ax.text(0,0.0025, "{}".format("MIC(1) = 1"), color="blue", transform=trans, 
        ha="right", va="top", fontsize = 12)



trans_2 = transforms.blended_transform_factory(
    ax.get_xticklabels()[0].get_transform(), ax.transData)

ax.text(84,0, "{}".format("\n84"), color="darkred", transform=trans_2, 
        ha="center", va="top", fontsize = 12)

ax.text(1.5,0, "{}".format("\n0"), color="darkred", transform=trans_2, 
        ha="center", va="top", fontsize = 12)


ax.axvline(x = 84, ymin = 0, ymax = 0.03, ls = '--', color = 'darkred' )


ax.set_yticks([])
ax.set_xticks([])

ax.spines['top'].set_color(None)
ax.spines['right'].set_color(None)
ax.spines['left'].set_linewidth(2)
ax.spines['bottom'].set_linewidth(2)
ax.set_ylabel("Concentration [mg/L]", labelpad = 80, fontsize = 15)
ax.set_xlabel("Time [h]", labelpad = 80, fontsize = 15)
ax.set_title("AUC/MIC", fontsize = 20, pad = 30)


plt.annotate("AUC/MIC", 
             xy=(18, 0.02), 
             xytext=(18, 0.03), 
             arrowprops=dict(arrowstyle="->"), fontsize = 12);

;

这就是我所拥有的:

在此处输入图像描述

这就是我想要的(它是用油漆完成的,所以请原谅我:)): 在此处输入图像描述

我正在试验fill_between 和fill_betweenx。然而,没有任何令人满意的结果。确实,想法用完了。我真的很感激这方面的任何帮助。最良好的祝愿!

4

1 回答 1

1

你的fill_between作品符合预期。问题是color="lemonchiffon"withalpha=0.3几乎不可见。尝试使用更亮的颜色和/或更高的alpha.

因此,这会对零和 kde 曲线之间的图形部分着色。

现在,要在水平线上方和下方创建不同的颜色,where=np.minimum用于fill_between

pos_hline = 0.002
ax.fill_between(x1, pos_hline, y1, color="yellow", alpha=0.3, where=y1 > pos_hline)
ax.fill_between(x1, 0, np.minimum(y1, pos_hline), color="blue", alpha=0.3)

没有where=y1 > pos_hline,fill_between也会为曲线上方的区域着色,其中曲线低于该水平线。

结果图

PS:请注意,sns.histplot自 Seaborn 版本以来已弃用0.11。要仅绘制 kde 曲线,您可以使用sns.kdeplot

sns.kdeplot(final_dist, ax=ax, color='darkred', linewidth=4)
于 2020-11-17T23:11:36.237 回答