首页 > 解决方案 > 用 ggplot2 和 geom_bar 改变 X 轴的起点

问题描述

我正在使用 ggplot 制作一系列条形图,这些图是(例如)多个不同年份的给定日期的巢数。我可以使图没有问题并使用cowplot将它们排列在一个图中,但是,我希望它们都具有可比性并在同一天开始。这是一个示例图,这里是数据。

dput(ringday2015)结构(列表(Var1 =结构(1:37,.Label = c(“42”,“43”,“44”,“45”,“46”,“47”,“48”,“ 49”、“50”、“51”、“52”、“53”、“54”、“55”、“56”、“57”、“58”、“59”、“60”、“61” 、“62”、“63”、“64”、“65”、“66”、“67”、“69”、“70”、“72”、“73”、“74”、“79”、“ 83", "85", "88", "89", "91"), class = "factor"), Freq = c(1L, 1L, 1L, 2L, 5L, 6L, 7L, 12L, 15L, 22L , 12L, 19L, 17L, 26L, 16L, 17L, 13L, 13L, 13L, 9L, 1L, 5L, 4L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L , 1L, 1L)),类 = "data.frame", row.names = c(NA, -37L))

这个情节从第 42 天开始,但对于下一个情节,它从第 33 天开始,然后在第 31 天开始。所以我想让它们都从第 30 天开始。我尝试过使用scale_x_continousscale_x_discretexlim和任何其他建议我见过,但似乎对情节没有任何影响,即 x 轴没有变化或变化太大,以至于情节毫无用处。我错过了什么?

代码:

ringdayplot2015<- ggplot(data = ringday2015, aes(Var1, Freq )) + geom_bar(stat = "identity") +
  xlab("April Day (days after April 1st)") + ylab("No. of nests") + ggtitle("No. of nests ringed 2015")

以上是我用来制作情节的代码

标签: rggplot2plot

解决方案


根据您的解释,我认为问题是因为在 R 中将一个因子转换为数字as.numeric()通常会更改数据,您需要先将其转换为字符,然后再转换为数字:

ringday2015$Var1 = as.numeric(as.character(ringday2015$Var1))

然后我简单地添加xlim(30, max(ringday2015$Freq))并得到了你想要的。

我想如果可能的话,在创建数据集时更正 Var1 的类会更有效。

在不同的问题上,最好不要为每个数据集创建一个图,而是将所有数据集合并在一起并创建一个多面图。一种方法是:

df = numeric() #Empty vector to create the big dataset
data.names = c("ringday2015", "ringday2016") #The names of your small datasets

#Rbinding it and adding a column saying the name of the dataset
for(i in data.names){
  df = rbind(df, cbind(get(i), Graph=i))} 


#Then plotting it:
ggplot(df, aes(Var1, Freq)) +
  geom_bar(stat = "identity") +
  facet_grid(~Graph) +
  xlim(30, max(df$Freq)) +
  xlab("April Day (days after April 1st)") +
  ylab("No. of nests") + ggtitle("No. of nests ringed 2015")

即使您不选择这种方法,您仍然不需要通过重复 ggplot 代码和更改数据集来创建每个图形,您可以这样做:

for(i in data.names){
   assign(paste0("plot", i),
          ggplot(get(i), aes(...) + ...}

最后一件事,创建一堆变量会使你的编码组织得很差,这就是为什么使用类似的函数get()并且assign()通常应该是最后的手段。我会更好,而不是每个数据集的一个变量,您有一个包含所有变量的列表,并且循环按该列表中的项目而不是变量名进行。如果你愿意,你可以给我更多关于你如何获得这些数据集的背景信息,我可以帮助你。


推荐阅读