【问题标题】:Play graphic of ggplot2 using multiple facets使用多个方面播放 ggplot2 的图形
【发布时间】:2017-04-21 18:07:10
【问题描述】:

我使用gridExtra 包中的命令grid.arrange 构建了下面的图表,想留下多面图的视觉效果,使用样本大小作为面,这可能吗?

library(ggplot2)
library(grid)
library(utils)
grid.newpage()
#Lendo os dados
dt1 <- read.table("https://cdn.rawgit.com/fsbmat/StackOverflow/master/sim50.txt", header = TRUE)
attach(dt1)
#head(dt1)
dt2 <- read.table("https://cdn.rawgit.com/fsbmat/StackOverflow/master/sim200.txt", header = TRUE)
attach(dt2)
#head(dt2)
dt3 <- read.table("https://cdn.rawgit.com/fsbmat/StackOverflow/master/sim1000.txt", header = TRUE)
attach(dt3)
#head(dt3)
g1 <- ggplot(dt1, aes(x=dt1$gamma0))+coord_cartesian(xlim=c(-1.3,3.3),ylim = c(0,0.63)) +
  ggtitle("n=50")+ 
  theme(plot.title = element_text(margin = margin(b = 2),size = 6,hjust = 0))
g1 <- g1+geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                        binwidth=.5,
                        colour="black", fill="white",breaks=seq(-3, 3, by = 0.1)) 
g1 <- g1 + stat_function(fun=dnorm,
                         color="black",geom="area", fill="gray", alpha=0.1,
                         args=list(mean=mean(dt1$gamma0), 
                                   sd=sd(dt1$gamma0)))
g1 <- g1+  geom_vline(aes(xintercept=1.23, linetype="Valor Verdadeiro"),show.legend =TRUE)
g1 <- g1+  geom_vline(aes(xintercept=mean(dt1$gamma0, na.rm=T),    linetype="Valor Estimado"),show.legend =TRUE)
g1 <- g1+  scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot
g1 <- g1+  xlab(expression(paste(gamma[0])))+ylab("")
g1 <- g1+  theme(plot.margin=unit(c(0.1, 0.1, 0.1, 0.1), units="line"),
                 legend.text=element_text(size=5),
                 legend.position = c(0, 0.97),
                 legend.justification = c("left", "top"),
                 legend.box.just = "left",
                 legend.margin = margin(0,0,0,0),
                 legend.title=element_blank(),
                 legend.direction = "vertical",
                 legend.background = element_rect(colour = NA,fill="transparent", size=.5, linetype="dotted"),
                 legend.key = element_rect(colour = "transparent", fill = NA))
g1 <- g1+ guides(linetype = guide_legend(override.aes = list(size = 0.5)))


# Adjust key height and width
g1 = g1 + theme(
  legend.key.height = unit(0.3, "cm"),
  legend.key.width  = unit(0.4, "cm"))

# Get the ggplot Grob
gt1 = ggplotGrob(g1)

# Edit the relevant keys

gt1 <- editGrob(grid.force(gt1), gPath("key-[3,4]-1-[1,2]"), 
                grep = TRUE, global = TRUE,
                x0 = unit(0, "npc"), y0 = unit(0.5, "npc"), 
                x1 = unit(1, "npc"), y1 = unit(0.5, "npc")) 

###################################################

g2 <- ggplot(dt2, aes(x=dt2$gamma0))+coord_cartesian(xlim=c(0,3),ylim = c(0,1.26)) +
  ggtitle("n=200")+ 
  theme(plot.title = element_text(margin = margin(b = 2),size = 6,hjust = 0))
g2 <- g2+geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                        binwidth=.5,
                        colour="black", fill="white",breaks=seq(-3, 3, by = 0.1)) 
g2 <- g2 + stat_function(fun=dnorm,
                         color="black",geom="area", fill="gray", alpha=0.1,
                         args=list(mean=mean(dt2$gamma0), 
                                   sd=sd(dt2$gamma0)))
g2 <- g2+  geom_vline(aes(xintercept=1.23, linetype="Valor Verdadeiro"),show.legend =TRUE)
g2 <- g2+  geom_vline(aes(xintercept=mean(dt2$gamma0, na.rm=T),    linetype="Valor Estimado"),show.legend =TRUE)
g2 <- g2+  scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot
g2 <- g2+  xlab(expression(paste(gamma[0])))+ylab("")
g2 <- g2+  theme(plot.margin=unit(c(0.1, 0.1, 0.1, 0.1), units="line"),
                 legend.text=element_text(size=5),
                 legend.position = c(0, 0.97),
                 legend.justification = c("left", "top"),
                 legend.box.just = "left",
                 legend.margin = margin(0,0,0,0),
                 legend.title=element_blank(),
                 legend.direction = "vertical",
                 legend.background = element_rect(colour = NA,fill="transparent", size=.5, linetype="dotted"),
                 legend.key = element_rect(colour = "transparent", fill = NA))
g2 <- g2+ guides(linetype = guide_legend(override.aes = list(size = 0.5)))

# Adjust key height and width
g2 = g2 + theme(
  legend.key.height = unit(0.3, "cm"),
  legend.key.width = unit(0.4, "cm"))

# Get the ggplot Grob
gt2 = ggplotGrob(g2)

# Edit the relevant keys

gt2 <- editGrob(grid.force(gt2), gPath("key-[3,4]-1-[1,2]"), 
                grep = TRUE, global = TRUE,
                x0 = unit(0, "npc"), y0 = unit(0.5, "npc"), 
                x1 = unit(1, "npc"), y1 = unit(0.5, "npc")) 

#######################################################

g3 <- ggplot(dt3, aes(x=gamma0))+coord_cartesian(xlim=c(0.6,1.8),ylim = c(0,2.6)) +
  ggtitle("n=1000")+ 
  theme(plot.title = element_text(margin = margin(b = 2),size = 6,hjust = 0))
g3 <- g3+geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                        binwidth=.5,
                        colour="black", fill="white",breaks=seq(-3, 3, by = 0.1)) 
g3 <- g3 + stat_function(fun=dnorm,
                         color="black",geom="area", fill="gray", alpha=0.1,
                         args=list(mean=mean(dt3$gamma0), 
                                   sd=sd(dt3$gamma0)))
g3 <- g3+  geom_vline(aes(xintercept=1.23, linetype="Valor Verdadeiro"),show.legend =TRUE)
g3 <- g3+  geom_vline(aes(xintercept=mean(dt3$gamma0, na.rm=T),    linetype="Valor Estimado"),show.legend =TRUE)
g3 <- g3+  scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot
g3 <- g3+  xlab(expression(paste(gamma[0])))+ylab("")
g3 <- g3+  theme(plot.margin=unit(c(0.1, 0.1, 0.1, 0.1), units="line"),
                 legend.text=element_text(size=5),
                 legend.position = c(0, 0.97),
                 legend.justification = c("left", "top"),
                 legend.box.just = "left",
                 legend.margin = margin(0,0,0,0),
                 legend.title=element_blank(),
                 legend.direction = "vertical",
                 legend.background = element_rect(colour = NA,fill="transparent", size=.5, linetype="dotted"),
                 legend.key = element_rect(colour = "transparent", fill = NA))
g3 <- g3+ guides(linetype = guide_legend(override.aes = list(size = 0.5)))


# Adjust key height and width
g3 = g3 + theme(
  legend.key.height = unit(.3, "cm"),
  legend.key.width = unit(.4, "cm"))

# Get the ggplot Grob
gt3 = ggplotGrob(g3)

# Edit the relevant keys

gt3 <- editGrob(grid.force(gt3), gPath("key-[3,4]-1-[1,2]"), 
                grep = TRUE, global = TRUE,
                x0 = unit(0, "npc"), y0 = unit(0.5, "npc"), 
                x1 = unit(1, "npc"), y1 = unit(0.5, "npc")) 

####################################################

library(gridExtra)
grid.arrange(gt1, gt2, gt3, widths=c(0.3,0.3,0.3), ncol=3)

注意:我想重现相同的图表,但使用 facet_wrap 的格式,使用 n = 50n = 200n = 1000 作为构面。

【问题讨论】:

    标签: r ggplot2 facet facet-wrap


    【解决方案1】:

    (i) 将三个 data.frames rbind 在一起,并给它一个将出现在 facet_wrap 标签上的类型,即n=50n=200n=1000

    dat <- list(dt1, dt2, dt3) %>% setNames(c("dt1", "dt2", "dt3"))
    dat <- ldply(names(dat), function(x) dat[[x]] %>% mutate(type = x %>% as.factor))  
    levels(dat$type) <- c("n=50", "n=200", "n=1000")
    

    (ii) 用facet_wrap(~type) 绘制图形

    ggplot(dat, aes(x=gamma0)) + 
      geom_histogram(aes(y=..density..), binwidth=.5, colour="black", fill="white",breaks=seq(-3, 3, by = 0.1)) +
      stat_function(fun=dnorm, color="black",geom="area", fill="gray", alpha=0.1, args=list(mean=mean(dt1$gamma0), sd=sd(dt1$gamma0))) +
      geom_vline(aes(xintercept=1.23, linetype="Valor Verdadeiro"),show.legend =TRUE) +
      geom_vline(aes(xintercept=mean(dt1$gamma0, na.rm=T),    linetype="Valor Estimado"),show.legend =TRUE) +
      scale_linetype_manual(values=c("dotdash","solid")) +
      facet_wrap(~type, scales="free")
    

    • 请注意,我已经删除了您的主题元素和轴设置,因为它们对于使用的每个 data.frame 都过于定制。

    【讨论】:

    • 非常感谢,我仍然对如何在三张图上重叠密度法线感到疑惑?有可能吗?
    【解决方案2】:

    我使用grid.arrange得到它:

    library(ggplot2)
    library(grid)
    library(utils)
    grid.newpage()
    
    dt1 <- read.table("https://cdn.rawgit.com/fsbmat/StackOverflow/master/sim50.txt", header = TRUE)
    attach(dt1)
    #head(dt1)
    dt2 <- read.table("https://cdn.rawgit.com/fsbmat/StackOverflow/master/sim200.txt", header = TRUE)
    attach(dt2)
    #head(dt2)
    dt3 <- read.table("https://cdn.rawgit.com/fsbmat/StackOverflow/master/sim1000.txt", header = TRUE)
    attach(dt3)
    #head(dt3)
    g1 <- ggplot(dt1, aes(x=dt1$gamma0))+coord_cartesian(xlim=c(-1.3,3.3),ylim = c(0,0.63)) +
      theme(plot.title = element_text(margin = margin(b = 2),size = 6,hjust = 0))
    g1 <- g1+geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                            binwidth=.5,
                            colour="black", fill="white",breaks=seq(-3, 3, by = 0.1)) 
    g1 <- g1 + stat_function(fun=dnorm,
                             color="black",geom="area", fill="gray", alpha=0.1,
                             args=list(mean=mean(dt1$gamma0), 
                                       sd=sd(dt1$gamma0)))
    g1 <- g1+  geom_vline(aes(xintercept=1.23, linetype="Valor Verdadeiro"),show.legend =TRUE)
    g1 <- g1+  geom_vline(aes(xintercept=mean(dt1$gamma0, na.rm=T),    linetype="Valor Estimado"),show.legend =TRUE)
    g1 <- g1+  scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot
    g1 <- g1+  xlab(expression(paste(gamma[0])))+ylab("densidade")
    g1 <- g1+  annotate("rect", xmin = -2, xmax = 3.52, ymin = 0.635, ymax = 0.7, fill="gray")
    g1 <- g1+  annotate("text", x = 1.23, y = 0.65, label = "n=50", size=4)
    g1 <- g1+  theme(plot.margin=unit(c(0.1, 0.1, 0.1, 0.1), units="line"),
                     legend.text=element_text(size=5),
                     legend.position = c(0, 0.97),
                     legend.justification = c("left", "top"),
                     legend.box.just = "left",
                     legend.margin = margin(0,0,0,0),
                     legend.title=element_blank(),
                     legend.direction = "vertical",
                     legend.background = element_rect(colour = NA,fill="transparent", size=.5, linetype="dotted"),
                     legend.key = element_rect(colour = "transparent", fill = NA),
                     axis.text.y=element_blank(),
                     axis.ticks.y=element_blank())
    g1 <- g1+ guides(linetype = guide_legend(override.aes = list(size = 0.5)))
    
    
    # Adjust key height and width
    g1 = g1 + theme(
      legend.key.height = unit(0.3, "cm"),
      legend.key.width  = unit(0.4, "cm"))
    
    # Get the ggplot Grob
    gt1 = ggplotGrob(g1)
    
    # Edit the relevant keys
    
    gt1 <- editGrob(grid.force(gt1), gPath("key-[3,4]-1-[1,2]"), 
                    grep = TRUE, global = TRUE,
                    x0 = unit(0, "npc"), y0 = unit(0.5, "npc"), 
                    x1 = unit(1, "npc"), y1 = unit(0.5, "npc")) 
    
    ###################################################
    
    g2 <- ggplot(dt2, aes(x=dt2$gamma0))+coord_cartesian(xlim=c(0,3),ylim = c(0,1.26)) +
      theme(plot.title = element_text(margin = margin(b = 2),size = 6,hjust = 0))
    g2 <- g2+geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                            binwidth=.5,
                            colour="black", fill="white",breaks=seq(-3, 3, by = 0.1)) 
    g2 <- g2 + stat_function(fun=dnorm,
                             color="black",geom="area", fill="gray", alpha=0.1,
                             args=list(mean=mean(dt2$gamma0), 
                                       sd=sd(dt2$gamma0)))
    g2 <- g2+  geom_vline(aes(xintercept=1.23, linetype="Valor Verdadeiro"),show.legend =TRUE)
    g2 <- g2+  geom_vline(aes(xintercept=mean(dt2$gamma0, na.rm=T),    linetype="Valor Estimado"),show.legend =TRUE)
    g2 <- g2+  scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot
    g2 <- g2+  xlab(expression(paste(gamma[0])))+ylab("")
    g2 <- g2+  annotate("rect", xmin = -2, xmax = 3.5, ymin = 1.27, ymax = 1.8, fill="gray")
    g2 <- g2+  annotate("text", x = 1.23, y = 1.3, label = "n=200", size=4)
    
    g2 <- g2+  theme(plot.margin=unit(c(0.1, 0.1, 0.1, 0.1), units="line"),
                     legend.text=element_text(size=5),
                     legend.position = c(0, 0.97),
                     legend.justification = c("left", "top"),
                     legend.box.just = "left",
                     legend.margin = margin(0,0,0,0),
                     legend.title=element_blank(),
                     legend.direction = "vertical",
                     legend.background = element_rect(colour = NA,fill="transparent", size=.5, linetype="dotted"),
                     legend.key = element_rect(colour = "transparent", fill = NA),
                     axis.title.y=element_blank(),
                     axis.text.y=element_blank(),
                     axis.ticks.y=element_blank())
    g2 <- g2+ guides(linetype = guide_legend(override.aes = list(size = 0.5)))
    
    # Adjust key height and width
    g2 = g2 + theme(
      legend.key.height = unit(0.3, "cm"),
      legend.key.width = unit(0.4, "cm"))
    
    # Get the ggplot Grob
    gt2 = ggplotGrob(g2)
    
    # Edit the relevant keys
    
    gt2 <- editGrob(grid.force(gt2), gPath("key-[3,4]-1-[1,2]"), 
                    grep = TRUE, global = TRUE,
                    x0 = unit(0, "npc"), y0 = unit(0.5, "npc"), 
                    x1 = unit(1, "npc"), y1 = unit(0.5, "npc")) 
    
    #######################################################
    
    g3 <- ggplot(dt3, aes(x=gamma0))+coord_cartesian(xlim=c(0.6,1.8),ylim = c(0,2.6)) +
      theme(plot.title = element_text(margin = margin(b = 2),size = 6,hjust = 0))
    g3 <- g3+geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                            binwidth=.5,
                            colour="black", fill="white",breaks=seq(-3, 3, by = 0.1)) 
    g3 <- g3 + stat_function(fun=dnorm,
                             color="black",geom="area", fill="gray", alpha=0.1,
                             args=list(mean=mean(dt3$gamma0), 
                                       sd=sd(dt3$gamma0)))
    g3 <- g3+  geom_vline(aes(xintercept=1.23, linetype="Valor Verdadeiro"),show.legend =TRUE)
    g3 <- g3+  geom_vline(aes(xintercept=mean(dt3$gamma0, na.rm=T),    linetype="Valor Estimado"),show.legend =TRUE)
    g3 <- g3+  scale_linetype_manual(values=c("dotdash","solid")) # Overlay with transparent density plot
    g3 <- g3+  labs(x=expression(paste(gamma[0])), y="")
    g3 <- g3+  annotate("rect", xmin = -2, xmax = 1.875, ymin = 2.62, ymax = 3, fill="gray")
    g3 <- g3+  annotate("text", x = 1.23, y = 2.68, label = "n=1000", size=4)
    g3 <- g3+  theme(plot.margin=unit(c(0.1, 0.1, 0.1, 0.1), units="line"),
                     legend.text=element_text(size=5),
                     legend.position = c(0, 0.97),
                     legend.justification = c("left", "top"),
                     legend.box.just = "left",
                     legend.margin = margin(0,0,0,0),
                     legend.title=element_blank(),
                     legend.direction = "vertical",
                     legend.background = element_rect(colour = NA,fill="transparent", size=.5, linetype="dotted"),
                     legend.key = element_rect(colour = "transparent", fill = NA),
                     axis.title.y=element_blank(),
                     axis.text.y=element_blank(),
                     axis.ticks.y=element_blank())
    g3 <- g3+ guides(linetype = guide_legend(override.aes = list(size = 0.5)))
    
    
    # Adjust key height and width
    g3 = g3 + theme(
      legend.key.height = unit(.3, "cm"),
      legend.key.width = unit(.4, "cm"))
    
    # Get the ggplot Grob
    gt3 = ggplotGrob(g3)
    
    # Edit the relevant keys
    
    gt3 <- editGrob(grid.force(gt3), gPath("key-[3,4]-1-[1,2]"), 
                    grep = TRUE, global = TRUE,
                    x0 = unit(0, "npc"), y0 = unit(0.5, "npc"), 
                    x1 = unit(1, "npc"), y1 = unit(0.5, "npc")) 
    
    ####################################################
    
    library(gridExtra)
    grid.arrange(gt1, gt2, gt3, widths=c(0.1,0.1,0.1), ncol=3)
    

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      相关资源
      最近更新 更多