微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R如何防止ggplot geom_text在命名绘图对象上使用新的数据库数据 数据库物种1图的代码物种2图的代码

如何解决R如何防止ggplot geom_text在命名绘图对象上使用新的数据库数据 数据库物种1图的代码物种2图的代码

我正尝试使用相同的代码和独特的珊瑚物种数据库来制作一系列地块。

数据库

data_1 <- structure(list(Site_long = structure(c(1L,1L,2L,2L),.Label = c("Hanauma Bay","Waikiki"),class = "factor"),Shelter = structure(c(1L,.Label = c("Low","High"),class = c("ordered","factor"
)),mean = c(1.19986885018767,2.15593884020962,0.369605100791602,0.31005865611133),sd = c(2.5618758944073,3.67786619671933,1.0285671157698,0.674643037178562),lower = c(0.631321215232725,1.33972360808602,0.141339007832154,0.160337623931733),upper = c(1.76841648514261,2.97215407233321,0.59787119375105,0.459779688290928),sample_size = c(78L,78L,78L)),row.names = c(NA,-4L),groups = structure(list(
    Site_long = structure(1:2,"Waikiki"
    ),.rows = structure(list(1:2,3:4),ptype = integer(0),class = c("vctrs_list_of","vctrs_vctr","list"))),row.names = 1:2,class = c("tbl_df","tbl","data.frame"),.drop = TRUE),class = c("grouped_df","tbl_df","data.frame"))

data_2 <- structure(list(Site_long = structure(c(2L,1L),mean = c(0.695203162997812,0.838720069947102,0.76957780057238,0.771070502382599),sd = c(1.17117437618039,1.02766824928792,1.43499288333539,1.28634022958585),lower = c(0.435288768568787,0.610653459098997,0.451115141323908,0.485597776371556),upper = c(0.955117557426838,1.06678668079521,1.08804045982085,1.05654322839364),.rows = structure(list(3:4,1:2),"data.frame"))

当我在第一个物种数据库(data_1)上运行代码时,条形图和相关的错误栏注释将正确呈现。请注意,我还创建了一个新变量“ data”,该变量将与以后在物种2中使用的对象相同。为了使此图在以后成为多个图的合成,我将图命名为“ species_1_plot”以保存它应对全球环境。

物种1图的代码

data <- data_1

mult_compare_recruitment <- c("A","A","A")

data <- data[c(3,4,1,2),]
data$Shelter <- factor(data$Shelter,levels = c("Low","High"))
# reorder summary dataframe for plotting 

position <- c("Waikiki","Hanauma Bay")
# ggplot2 barplot position with Waikiki (Low-High Shelter) and Hanauma Bay 

recruitment_plot_3 <- ggplot(data = data,aes(fill=Shelter,y=mean,x=Site_long)) + 
  geom_bar(position = "dodge",stat="identity",width = .8) +
  scale_x_discrete(limits = position) +
  geom_errorbar(aes(ymin = lower,ymax = upper),position = position_dodge(.8),width = .1) +
  geom_text(aes(label = mult_compare_recruitment,y = data$upper),vjust = -.5,position = position_dodge(width = 0.8),size = 4) +
  scale_fill_grey(name = "Shelter",start = .8,end = .2) +
  labs(x = "Site",y = expression(paste("Coral recruitment per m"^"2"))) + 
  theme_classic(base_size = 14.5) +
  theme(text = element_text(size = 18),axis.title.x = element_blank(),legend.position = "none",axis.text.y = element_text(angle = 90))

species_1_plot <- recruitment_plot_3

species_1_plot

enter image description here

为了创建下一个图,我在不同种类的数据库(data_2)上运行了相同的代码,同时再次将新数据库分配给对象“ data”。再次,我将新的图样“ species_2_plot”保存到了全局环境中。

物种2图的代码

data <- data_2

mult_compare_recruitment <- c("A","B","B")

data <- data[c(3,axis.text.y = element_text(angle = 90))

species_2_plot <- recruitment_plot_3

species_2_plot

enter image description here

问题是,当我再次绘制第一个树种图(species_1_plot)时,数据正确(条形图),但是文本注释的高度及其字母值不正确。它们实际上是来自物种_2_plot的值。

species_1_plot

enter image description here

我知道每个图都有问题,所以用唯一的名称将每个图保存到全球环境中。但是尽管如此,geom_text()似乎仍在使用第二个绘图中的数据(全局环境中的代码),尽管该绘图中的实际数据(条形)是正确的(来自species_plot_1)。我的理解是,当您将图命名为对象(species_1_plot和物种_2_plot)时,它类似于保存图,因此除非指定,否则将防止对图和注释进行任何更改。有什么方法可以防止这种情况的发生而无需专门命名数据库(data_1和data_2)?感谢所有输入。预先感谢!

解决方法

我建议您使用带有功能的方法。两次使用data的事实可能是在改变环境,结果地块也随之改变。我使用数据,职位和招聘参数创建了一个函数,并显示输出。您必须以在代码中定义变量的相同方式来填充它们。函数在内部环境中起作用,因此关于数据的处理方式可能没有问题。这是我使用共享数据的代码:

library(ggplot2)
#Function
myplotfunc <- function(x,y,z)
{
    data <- x
    
    mult_compare_recruitment <- y
    
    data <- data[c(3,4,1,2),]
    data$Shelter <- factor(data$Shelter,levels = c("Low","High"))
    # reorder summary dataframe for plotting 
    
    position <- z
    # ggplot2 barplot position with Waikiki (Low-High Shelter) and Hanauma Bay 
    
    plot <- ggplot(data = data,aes(fill=Shelter,y=mean,x=Site_long)) + 
        geom_bar(position = "dodge",stat="identity",width = .8) +
        scale_x_discrete(limits = position) +
        geom_errorbar(aes(ymin = lower,ymax = upper),position = position_dodge(.8),width = .1) +
        geom_text(aes(label = mult_compare_recruitment,y = data$upper),vjust = -.5,position = position_dodge(width = 0.8),size = 4) +
        scale_fill_grey(name = "Shelter",start = .8,end = .2) +
        labs(x = "Site",y = expression(paste("Coral recruitment per m"^"2"))) + 
        theme_classic(base_size = 14.5) +
        theme(text = element_text(size = 18),axis.title.x = element_blank(),legend.position = "none",axis.text.y = element_text(angle = 90))
    return(plot)
}
#Code
o1 <- myplotfunc(x=data_1,y=c("A","A","A"),z=c("Waikiki","Hanauma Bay"))
o2 <- myplotfunc(x=data_2,"B","B"),"Hanauma Bay"))

输出:

enter image description here

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。