草庐IT

ggplot2再话箱线图之几何填充

R语言数据分析指南 2023-09-30 原文

有观众老爷询问如何对箱线图进行几何形状填充,那么今天就来具体介绍一番;在原有的基础上做了一些小的改动也许恰好您正好有此特殊需求,需要着重体会八个字变实为虚,变虚为实,希望对各位观众老爷有所帮助;下面来看具体案例;

需要获取数据的欢迎关注我的号留言

加载R包

library(tidyverse)
library(ggsci)
library(ggprism)
library(rstatix)
library(ggpubr)
library(ggpmisc)
library(ggpattern)

加载数据

gapminder <- read_tsv("gapminder.xls")

数据清洗

df <- gapminder %>%
  filter(year %in% c(1957,2002,2007),continent !="Oceania") %>%
  select(country,year,lifeExp,continent)%>%
  mutate(paired = rep(1:(n()/3),each=3),year=factor(year))

统计分析

df_p_val1 <- df %>% group_by(continent) %>%
  wilcox_test(lifeExp  ~ year) %>%
  adjust_pvalue(p.col = "p", method = "bonferroni") %>%
  add_significance(p.col = "p.adj") %>% 
  add_xy_position(x = "year", dodge = 0.8) 

构建填充类型

下面函数来自ggpattern包官方文档
https://coolbutuseless.github.io/package/ggpattern/articles/developing-patterns.html

tiling3_pattern <- function(params, boundary_df, aspect_ratio, legend = FALSE) {
  args <- as.list(params)
  args <- args[grep("^pattern_", names(args))]
  
  # hexagonal tiling using "regular_polygon" pattern
  args$pattern <- "polygon_tiling"
  
  # three-color tiling using `fill`, `pattern_fill` and their "average"
  avg_col <- gridpattern::mean_col(params$fill, params$pattern_fill)
  args$pattern_fill <- c(params$fill, avg_col, args$pattern_fill)
  
  args$x <- boundary_df$x
  args$y <- boundary_df$y
  args$id <- boundary_df$id
  args$prefix <- ""
  
  do.call(gridpattern::patternGrob, args)
}

options(ggpattern_geometry_funcs = list(tiling3 = tiling3_pattern))

数据可视化

df %>%
  ggplot(aes(year,lifeExp)) +
  stat_boxplot(aes(ymin = ..lower.., ymax = ..upper..),outlier.shape = NA,width=0.5) +
  stat_boxplot(geom = "errorbar", aes(ymin = ..ymax..),width=0.2,size=0.35) +
  stat_boxplot(geom = "errorbar", aes(ymax = ..ymin..),width=0.2,size=0.35) +
  geom_boxplot_pattern(aes(pattern = year,pattern_angle = year,fill=year),
                       pattern = 'tiling3', pattern_angle = 45,color="black",
                       pattern_spacing = 0.045,outlier.shape = NA,linetype = "dashed",width=0.5,size=0.35)+
  stat_summary(geom = "crossbar", fun = "median",width = 0.5,color="black",size=0.38)+
  stat_pvalue_manual(df_p_val1,label = "p.adj.signif",label.size=5,hide.ns = F)+
  scale_size_continuous(range=c(1,3))+
#  geom_smooth(method = "lm", formula = NULL,size=1,se=T,color="black",linetype="dashed",aes(group=1))+
  stat_cor(label.y = 25,aes(label = paste(..rr.label.., ..p.label.., sep = "~`,`~"),group=1),color="black",
           label.x.npc = "left")+
  stat_regline_equation(label.y = 19,aes(group=1),color="black")+
  facet_wrap(.~continent,nrow=1)+
  scale_fill_npg()+
  scale_x_discrete(guide = "prism_bracket")+
  scale_y_continuous(limits = c(0,95),minor_breaks = seq(0,95,5),guide = "prism_offset_minor")+
  labs(x=NULL,y=NULL)+
  theme_prism(base_line_size =0.4)+
  theme(plot.margin=unit(c(0.5,0.5,0.5,0.5),units=,"cm"),
        strip.text = element_text(size=12),
        axis.line = element_line(color = "black",size = 0.4),
        panel.grid.minor = element_blank(),
        panel.grid.major = element_line(size = 0.2,color = "#e5e5e5"),
        axis.text.y = element_text(color="black",size=10),
        axis.text.x = element_text(margin = margin(t = -5),color="black",size=10),
        legend.position = "none",
        panel.spacing = unit(0,"lines"))+
  coord_cartesian()

数据获取

还是熟悉的配方,除了构建三色形状填充外,需要体会的依然是变实为虚,变虚为实绘图思维尽在其中,那么本节介绍到此结束;需要数据的留言交流

有关ggplot2再话箱线图之几何填充的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  3. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  4. ruby - 如何用递增的值填充数组 Ruby - 2

    我正在尝试解决http://projecteuler.net/problem=1.我想创建一个方法,它接受一个整数,然后创建一个包含它前面的所有整数的数组,并将整数本身作为数组中的值。以下是我目前所拥有的。代码不起作用。defmake_array(num)numbers=Array.newnumcount=1numbers.eachdo|number|numbers 最佳答案 (1..num).to_a是您在Ruby中需要做的全部。1..num将创建一个Range对象,以1开始并以任意值num结束是。Range对象有to_a方法通过

  5. ruby-on-rails - RoR中是否有任何内置方法可以为整数填充零? - 2

    如果我想要“00001”而不是“1”,除了我自己写填零方法之外,有没有内置的方法可以帮助我为整数填零? 最佳答案 puts"%05d"%1#00001参见:String::%,Kernel::sprintf这是正在发生的事情。%左侧的"%05d"是C风格的格式说明符。%右边的变量就是要格式化的东西。格式说明符可以像这样解码:%-格式说明符的开头0-用前导零填充5-长度为5个字符d-被格式化的是一个整数如果你要格式化多个东西,你会把它们放在一个数组中:"%d-%s"%[1,"One"]#=>1-one

  6. ruby-on-rails - 用一系列时间增量填充选择,加上其他选项 - 2

    使用RubyonRails,我使用给定的增量(例如每30分钟)用时间填充“选择”。目前我正在YAML文件中写出所有的可能性,但我觉得有一种更巧妙的方法。我想我想提供一个开始时间、一个结束时间、一个增量,并且目前只提供一个名为“关闭”的选项(想想“business_hours”)。所以,我的选择可能会显示:'Closed'5:00am5:30am6:00am...[allthewayto]...11:30pm谁能想出更好的方法,或者只是将它们全部“拼写”出来的最佳方法? 最佳答案 此答案基于@emh的答案。defcreate_hour

  7. python - python的进化路线图是什么 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。在哪里可以找到python的中期或长期路线图。借此,我可以了解决策者最关心的是什么,以及他们眼中这门语言的future是什么?一段时间以来,我一直在玩弄Python和Ruby,制作我在开发中需要的中小型工具,通过比较不同但相似的语言来获得乐趣和学习。Python和Ruby的许多特性可以互换,或者易于模仿。两者都引入了一些函数式风格并且发展迅速(Py300

  8. ruby-on-rails - 将没有默认值的 NOT NULL 字段添加到填充的数据库中 - 2

    我有一个表,我们称它为MyTable。它是Postgresql数据库的一部分。MyTable中有很多条目,比方说超过一百万。我想向该表中添加一个字段,我们将其命名为MyNewField。它由ActiveRecord迁移添加。此字段没有默认值且不可为空。结果,在它的迁移类中将是这样的:classAddMyFieldToMyTable但是,它会触发一个错误(PG::NotNullViolation),因为该表已经包含行,所有这些行的MyField都设置为NULL。我想做的是:添加没有默认值且可空设置为false的行(不触发PG::NotNullViolation)。然后,将另一个表中的值插

  9. ruby-on-rails - 如何按照散列中的数字序列生成和填充缺失数据 - 2

    我正在尝试创建一个函数来完成以下哈希中的小时序列。{name:"cardio",data:[["06:00",999],["09:00",154],["10:00",1059],["11:00",90]]}它应该在字段数据中创建所有缺失值["07:00",0],["08:00",0],["12:00",0],["13:00",0]...["23:00",0]预期结果:{name:"cardio",data:[["06:00",999],["07:00",0],["08:00",0],["09:00",154],["10:00",1059],["11:00",90]],["12:00",

  10. ruby-on-rails - 如何为特色对象预填充表单? - 2

    用户可以输入自定义:action或选择特色:action:Orchooseafeaturedchallenge:如果用户选择特色:action,新的挑战/_form会预先填充他选择的:action,但现在我想把它带到在您的帮助下更上一层楼!Challenge:DoOn:DoFor:如何预填充特色挑战的其他属性,例如“DoFor”或“DoOn”?例如,如果用户选择特色:action:'RunaMile那么我会用RunaMile预填充表单>,周一、周三、周五,30天。 最佳答案 您可以将simple_form与reform一起使用。Re

随机推荐