r - 用 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_continous、scale_x_discrete、xlim和任何其他建议我见过,但似乎对情节没有任何影响,即 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")
以上是我用来制作情节的代码
解决方案
根据您的解释,我认为问题是因为在 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()
通常应该是最后的手段。我会更好,而不是每个数据集的一个变量,您有一个包含所有变量的列表,并且循环按该列表中的项目而不是变量名进行。如果你愿意,你可以给我更多关于你如何获得这些数据集的背景信息,我可以帮助你。
推荐阅读
- java - Java接口作为引用类型?
- teamcity - 根据退出代码标记构建成功
- javascript - Webpack - 当导入未定义/未声明时发出警告
- python-3.x - Flask-SocketIO 发射不能从不同的模块工作?
- python - Pandas 将时间序列数据重新采样为 15 分钟和 45 分钟 - 使用多索引或列
- xml - xmlstarlet Fritzbox FB 电话簿到 CSV
- php - 如何通过存储在其中的值搜索 Google 表格
- python - Pandas——将值从一列映射到另一列
- php - 尝试从应用文件夹而不是存储中检索 Laravel 文件夹中的文件
- java - 在 log4j 2 中使用 throwable 和参数