【问题标题】:stop bar plots from overlapping in ggplot阻止条形图在ggplot中重叠
【发布时间】:2019-03-24 11:47:55
【问题描述】:

我希望将两个不同的数据集相互定位,例如当您有 position="dodge"(侵蚀和沉积区域)时,然后绘制两个线图,显示每个河段的侵蚀和沉积速率。现在,沉积区域和侵蚀条形图相互重叠。如果我重新组织数据并用 geom_bar(position="dodge") 绘制它(见右下角),我可以让它们堆叠起来,但在这个过程中,我的费率数据也被表示为一个条形图,它我不想。先感谢您。

这是我当前的图表: 我希望得到这样的东西:


EroDepoStuff <- tibble::tribble(
                 ~Reach, ~Total.lateral.erosion, ~Total.lateral.deposition, ~Lateral.erosion.rate, ~Lateral.deposition.rate,
              "Reach 1",              44.818334,                  17.400127,             4.4818334,                1.7400127,
              "Reach 2",              91.865675,                   91.39827,             9.1865675,                 9.139827,
              "Reach 3",                7.40573,                  16.654819,              0.740573,                1.6654819,
              "Reach 4",              25.214554,                  52.084122,             2.5214554,                5.2084122,
                  "All",             169.304293,                 177.537338,            16.9304293,               17.7537338
              )

EroDepoGraph <- ggplot(EroDepoStuff,aes(x=Reach,group=4)) +
  geom_bar(aes(y=Total.lateral.erosion,fill="Lateral erosion"),position="dodge",stat="identity") +
  geom_point(aes(y=Lateral.erosion.rate*10,colour="Lateral erosion rate")) +
  geom_line(aes(y=Lateral.erosion.rate*10,colour="Lateral erosion rate")) +
  geom_bar(aes(y=Total.lateral.deposition,fill="Lateral deposition"),position="dodge",stat="identity")+
  geom_line(aes(y=Lateral.deposition.rate*10,colour="Lateral deposition rate")) +
  geom_point(aes(y=Lateral.deposition.rate*10,colour="Lateral deposition rate")) +
  labs(y="Area (sq km)") +
  scale_fill_manual(values=c("Lateral erosion"="skyblue4","Lateral deposition"="blue")) +
  scale_colour_manual(values=c("Lateral erosion rate"="violetred3","Lateral deposition rate"="tan1")) +
  labs(color = "", fill = "") 


#adding second axis 
EroDepoGraph <- EroDepoGraph + scale_y_continuous(sec.axis = sec_axis(~./10,name = expression(paste("Rate (sq km/yr)"))))


#formatting axes
EroDepoGraph <- EroDepoGraph + theme(
  axis.title.x = element_blank(),
  axis.title.y = element_text(size=11),
  axis.text.x = element_text(size=11,angle=90,hjust=1),
  legend.position="bottom", 
  legend.spacing.y = unit(-0.1, "cm"),
  plot.title = element_text(size=12, face="bold")
)
EroDepoGraph

reOrganisedData <- ReorderedData <- tibble::tribble(
                      ~Reach,     ~Value,                      ~Type,
                   "Reach 1",  44.818334,    "Total lateral erosion",
                   "Reach 2",  91.865675,    "Total lateral erosion",
                   "Reach 3",    7.40573,    "Total lateral erosion",
                   "Reach 4",  25.214554,    "Total lateral erosion",
                       "All", 169.304293,    "Total lateral erosion",
                   "Reach 1",  17.400127, "Total.lateral.deposition",
                   "Reach 2",   91.39827, "Total.lateral.deposition",
                   "Reach 3",  16.654819, "Total.lateral.deposition",
                   "Reach 4",  52.084122, "Total.lateral.deposition",
                       "All", 177.537338, "Total.lateral.deposition",
                   "Reach 1",  4.4818334,     "Lateral erosion rate",
                   "Reach 2",  9.1865675,     "Lateral erosion rate",
                   "Reach 3",   0.740573,     "Lateral erosion rate",
                   "Reach 4",  2.5214554,     "Lateral erosion rate",
                       "All", 16.9304293,     "Lateral erosion rate",
                   "Reach 1",  1.7400127,  "Lateral deposition rate",
                   "Reach 2",   9.139827,  "Lateral deposition rate",
                   "Reach 3",  1.6654819,  "Lateral deposition rate",
                   "Reach 4",  5.2084122,  "Lateral deposition rate",
                       "All", 17.7537338,  "Lateral deposition rate"
                   )






【问题讨论】:

  • 将两个总计列合并为一列,将两个比率列合并为另一列。然后你可以在条形图上使用 position="dodge"。
  • 感谢您的回复。我已经尝试过了(如底部的数据集所示),但在此过程中,折线图最终显示为我不想要的条形图/:@iod

标签: r ggplot2


【解决方案1】:
EroDepoGraph  <- gather(EroDepoGraph, "totalType" , "totalVal", 
  Total.lateral.erosion, Total.lateral.deposition) %>%
  gather( "rateType" , "rateVal",Lateral.erosion.rate, 
  Lateral.deposition.rate )
EroDepoStuff$Reach<-factor(EroDepoStuff$Reach)
ggplot(EroDepoStuff,aes(x=as.numeric(Reach))) +
    geom_bar(aes(y=totalVal,fill=totalType),position="dodge",stat="identity") +
    geom_line(aes(y=rateVal*10,colour=rateType))+ 
    geom_point(aes(y=rateVal*10,colour=rateType)) + 
    scale_x_continuous(name="Reach", breaks=1:5, labels=levels(EroDepoStuff$Reach))

请注意,要使 geom_line 工作,x 轴必须是连续的,因此将其更改为因子,然后使用 as.numeric(Reach) 在 ggplot 中定义 x 轴。您试图通过在 aes() 调用中包含 group=4 来覆盖它来解决此问题,但随后您还覆盖了其他所有内容的分组,这导致了您遇到的问题。

【讨论】:

  • 您好,感谢您的帮助。我尝试了你的建议,但图表仍然重叠:(并且侵蚀/沉积率显示为单行而不是两行:(
  • 为带有示例结果的绘图添加了代码(未添加示例代码中包含的所有主题内容)。请注意,要使 geom_line 工作,x 轴必须是连续的,因此将其更改为因子,然后使用 as.numeric(Reach) 在 ggplot 中定义 x 轴。老实说,我什至不知道你原来的情节是如何得到台词的......
猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多