• python和R绘制箱线图+抖动点


    python和R绘制箱线图+抖动点

    散点箱线图

    IPCC AR6 https://www.ipcc.ch/
    通过散点展示数据的直观分布
    x轴刻度标签如果是“连续”数据,可添加渐变背景。通过渐变来体现升温幅度,美观形象。

    python版本:

    先手搓数据:

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    sns.set_theme(style="darkgrid")
    # Dataset:
    a = pd.DataFrame({ 'group' : np.repeat('A',50), 'value': np.random.normal(10, 5, 50) })
    b = pd.DataFrame({ 'group' : np.repeat('B',50), 'value': np.random.normal(13, 1.2, 50) })
    c = pd.DataFrame({ 'group' : np.repeat('B',50), 'value': np.random.normal(18, 1.2, 50) })
    d = pd.DataFrame({ 'group' : np.repeat('C',20), 'value': np.random.normal(25, 4, 20) })
    e = pd.DataFrame({ 'group' : np.repeat('D',10), 'value': np.random.uniform(12, size=10) })
    df = pd.concat([a, b, c, d, e])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    然后通过boxplot绘制箱线图,通过stripplot绘制抖动点,通过pointplot绘制平均值点。
    PS:pointplot并不是画“点”的函数,而是

    df = sns.load_dataset("penguins")
    sns.pointplot(data=df, x="sex", y="bill_depth_mm", hue="island", dodge=True)
    
    • 1
    • 2


    但是我们不要上下的误差线,也不用连接线:

    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    sns.set_theme(style="darkgrid")
    # Dataset:
    a = pd.DataFrame({ 'group' : np.repeat('A',50), 'value': np.random.normal(10, 5, 50) })
    b = pd.DataFrame({ 'group' : np.repeat('B',50), 'value': np.random.normal(13, 1.2, 50) })
    c = pd.DataFrame({ 'group' : np.repeat('B',50), 'value': np.random.normal(18, 1.2, 50) })
    d = pd.DataFrame({ 'group' : np.repeat('C',20), 'value': np.random.normal(25, 4, 20) })
    e = pd.DataFrame({ 'group' : np.repeat('D',10), 'value': np.random.uniform(12, size=10) })
    df = pd.concat([a, b, c, d, e])
    
    # Initialize the figure
    f, ax = plt.subplots()
    #sns.despine(bottom=True, left=True)
    
    # Show each observation with a scatterplot
    ax = sns.boxplot(x='group', y='value', data=df, color='white')#, showcaps=False)
    ax = sns.stripplot(
        data=df, x="group", y="value", hue="group",
         alpha=.25, zorder=1, legend=False, jitter=0.2
    )
    ax = sns.pointplot(
        data=df, x="group", y="value", hue="group",
        join=False,  palette="dark", estimator='mean',
        markers="d", scale=.75, errorbar=None
    )
    sns.legend = None
    
    #ax = sns.stripplot(x='group', y='value', data=df, color="orange", jitter=0.2, size=2.5)
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    R语言版本

    # edit by WangLonghao hhuwlh@163.com
    # 2022.11.15
    # generate data
    library(tidyverse)
    
    names <- c(rep("A", 40) , rep("B", 25) , rep("C", 35), rep("D", 30))
    value <- c( rnorm(40 , mean=10 , sd=9) , rnorm(25 , mean=2 , sd=15) , rnorm(35 , mean=0 , sd=10) , rnorm(30 , mean=-10 , sd=12))
    dplot <- data.frame(names,value)
    lower <- dplot$value %>% tapply(names, function(x){
      return(quantile(x, c(0.25)))
    })
    upper <- dplot$value %>% tapply(names, function(x){
      return(quantile(x, c(0.75)))
    })
    median <- dplot$value %>% tapply(names, median)
    
    dplot <- data.frame(names,value,
                        lower=c(rep(lower[1], 40), rep(lower[2], 25), rep(lower[3], 35), rep(lower[4], 30)),
                        upper=c(rep(upper[1], 40), rep(upper[2], 25), rep(upper[3], 35),rep(upper[4], 30)), 
                        median=c(rep(median[1], 40), rep(median[2], 25), rep(median[3], 35), rep(median[4], 30)))
    
    # Plot boxplot1
    dplot <- data.frame(names,value,lower=c(rep(lower[1], 40), rep(lower[2], 25), rep(lower[3], 35), rep(lower[4], 30)),
                        upper=c(rep(upper[1], 40), rep(upper[2], 25), rep(upper[3], 35),rep(upper[4], 30)), median=c(rep(median[1], 40), rep(median[2], 25), rep(median[3], 35), rep(median[4], 30)))
    
    dplot %>% 
      ggplot(aes(x=names,y=value))+
      geom_boxplot(color="black", fill="black", alpha=0.2, width=0.3, outlier.shape = NA, coef = 0) +
      geom_jitter(color="black", size=1, alpha=0.9, width=0.2)+
      theme_classic()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    晶须影响,我们也去掉了,只需要在代码中稍作修改

    image-20221115164415586

    接下来将图片导出到PPT,导出eps格式的图像,拖入ppt,右键“转换为形状”,再次右键“组合”——“取消组合”,这样就可以对图片的各个部件进行修改。

    接下来绘制一个长方形,置于图片底层,右键设置格式。填充与线条-渐变光圈,按下图设置:

    image-20221115165328633

    最后调整文字大小、截断坐标轴、添加圆圈形状来突出重点区域,复现结果如图:

    image-20221115175914653

  • 相关阅读:
    按权值建树,平面几何
    【服务器数据恢复】RAID5多块硬盘先后离线的数据恢复案例
    低代码产品能力定位图解读(附完整白皮书获取方式)|低代码助力企业数字化转型加速,赋能领域应用持续优化
    开发跨端微信小程序框架选型指南
    创邻科技入选全球知名市场资讯研究机构IDC最新研报
    flutter系列之:用来管理复杂状态的State详解
    rabbitMq创建交换机,以及路由键绑定队列教程
    拍摄视频,真的帧率越高越好吗?
    移动硬盘丢了怎么找回来呢?
    uni-app 之 tabBar 底部切换按钮
  • 原文地址:https://blog.csdn.net/wlh2067/article/details/128038632