【问题标题】:Remove space between bars within a grid删除网格中条之间的空间
【发布时间】:2016-10-24 19:12:10
【问题描述】:

我想将一个网格内的条移近一点以节省空间。有没有办法做到这一点?我使用的代码只是改变了条形的宽度,并没有改变间距。我知道bindwidth 不再在geom_bar 中工作,因为我提到了这些问题:

Adding space between bars in ggplot2 Increase space between bars in ggplot

这是数据

dput(grp1)
structure(list(Rot = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("2-year", 
"3-year", "4-year"), class = "factor"), Rot.Herb = structure(c(3L, 
4L, 13L, 14L, 5L, 6L, 9L, 10L, 15L, 16L, 1L, 2L, 7L, 8L, 11L, 
12L, 17L, 18L), .Label = c("A4-conv", "A4-low", "C2-conv", "C2-low", 
"C3-conv", "C3-low", "C4-conv", "C4-low", "O3-conv", "O3-low", 
"O4-conv", "O4-low", "S2-conv", "S2-low", "S3-conv", "S3-low", 
"S4-conv", "S4-low"), class = "factor"), Rot.trt = structure(c(2L, 
2L, 7L, 7L, 3L, 3L, 5L, 5L, 8L, 8L, 1L, 1L, 4L, 4L, 6L, 6L, 9L, 
9L), .Label = c("A4", "C2", "C3", "C4", "O3", "O4", "S2", "S3", 
"S4"), class = "factor"), Crop = structure(c(2L, 2L, 4L, 4L, 
2L, 2L, 3L, 3L, 4L, 4L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L), .Label = c("alfalfa", 
"corn", "oat", "soybean"), class = "factor"), Year = c(2014L, 
2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 
2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L, 2014L), Herb.trt = structure(c(1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L), .Label = c("conv", "low"), class = "factor"), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L), .Label = "kg.ha", class = "factor"), N = c(4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4), value = c(0.43168573275, 
16.22463846275, 0.554446363, 25.89844593075, 13.882743364, 84.1922080725, 
84.2625, 105.7375, 0.8350420895, 106.7464386085, 127.8875, 65.3875, 
1.964170084, 29.46524929925, 249.7625, 333.125, 0.535560112, 
28.757014893), sd = c(0.528135488290589, 20.3216237207314, 0.8810357408252, 
40.4576156325903, 27.3195114207629, 71.6424882235524, 22.6948736869511, 
40.9587266851237, 0.931926987921512, 108.45555847826, 89.1035387905553, 
25.141843442092, 2.20017281317418, 24.1072626208021, 93.2983509589889, 
85.0439543216722, 0.48339034731648, 33.2628789566726), se = c(0.264067744145294, 
10.1608118603657, 0.4405178704126, 20.2288078162951, 13.6597557103815, 
35.8212441117762, 11.3474368434756, 20.4793633425619, 0.465963493960756, 
54.2277792391299, 44.5517693952777, 12.570921721046, 1.10008640658709, 
12.0536313104011, 46.6491754794945, 42.5219771608361, 0.24169517365824, 
16.6314394783363), ci = c(0.840381416699796, 32.3362381637038, 
1.40192446910603, 64.3770946952626, 43.4714390915815, 113.999185974188, 
36.112608456959, 65.1744742040986, 1.48290379975249, 172.576995683309, 
141.783613905853, 40.0062833851536, 3.50096592013592, 38.3600344290379, 
148.458496149248, 135.323909108861, 0.76918191241357, 52.928663119381
)), .Names = c("Rot", "Rot.Herb", "Rot.trt", "Crop", "Year", 
"Herb.trt", "variable", "N", "value", "sd", "se", "ci"), row.names = c(NA, 
-18L), class = "data.frame")

这是代码

ggplot(grp1, aes(x=Rot.Herb, y=value, fill=factor(Herb.trt)))+
  geom_bar(stat="identity", position=position_dodge(.), width=.5)+
  scale_fill_brewer(palette = "Dark2")+
  theme_bw() +
  theme(panel.grid.major=element_blank()) +
  facet_grid(~Crop, scales = "free_x", space="free_x")+
  theme(legend.title=element_blank(),legend.text=element_text(size=20),legend.position="top")+
  geom_errorbar(aes(ymin=value-se, ymax=value+se), size=0.75, width=.25,position=position_dodge(.5))+
  xlab("Treatment") +
  theme(axis.title = element_text(size=24,face="bold", vjust=4)) +
  ylab("2014 total weed biomass (Kg/ha)\n") +
  theme(axis.title = element_text(size=24,face="bold", vjust=2), axis.text.y = element_text(size=20, color="black"))+
  theme(strip.text.x = element_text(colour = "black", size = 15), strip.background = element_rect(fill = "white"), axis.text.x = element_blank(), axis.ticks.x = element_blank())

还有图

我想要的是一个条形宽度为 0.5 且同一网格中条形之间没有间距的图表。谢谢大家的意见。

【问题讨论】:

  • position_dodge() 中的点有什么作用?
  • 感谢您的回复。我想用那个点来删除条之间的空间。
  • 如果我使用点会引发错误。
  • width 参数调整填充条之间的空间比例。 width = 1 表示 100% 的空间已填满(条之间没有空间),width = 0.5 表示条的宽度是它们接触时宽度的 50%。所以你遇到了问题,因为你希望两个条都接触,并且你希望条的宽度是它们需要接触的宽度的一半。
  • 另请注意,bindwidth 与此问题无关,因为您的数据已预先分箱。

标签: r ggplot2


【解决方案1】:

我认为您希望 width = 0.5 保持条形接触,因为您不希望 绝对宽度 改变(width = 0.5 改变 相对宽度)。这可能更接近您的要求。

ggplot(grp1, aes(x=Rot.Herb, y=value, fill=factor(Herb.trt)))+
  geom_bar(stat="identity", position = "dodge", width=1)+
  scale_x_discrete(expand=c(0.2,0))+
  scale_fill_brewer(palette = "Dark2")+
  theme_bw() +
  theme(panel.grid.major=element_blank()) +
  facet_grid(~Crop, scales = "free_x", space="free_x")+
  theme(legend.title=element_blank(),legend.text=element_text(size=20),legend.position="top")+
  geom_errorbar(aes(ymin=value-se, ymax=value+se), size=0.75, width=.25,position=position_dodge(0.5))+
  xlab("Treatment") +
  theme(axis.title = element_text(size=24,face="bold", vjust=4)) +
  ylab("2014 total weed biomass (Kg/ha)\n") +
  theme(axis.title = element_text(size=24,face="bold", vjust=2), axis.text.y = element_text(size=20, color="black"))+
  theme(strip.text.x = element_text(colour = "black", size = 15), strip.background = element_rect(fill = "white"), axis.text.x = element_blank(), axis.ticks.x = element_blank())

基本上我按照@Gregor 的建议更改了width = 1,这会导致条形接触,但添加了一个额外的选项scale_x_discrete(expand=c(0.2,0)) 来在条形和绘图边之间添加空格。这实际上调整了条形的绝对宽度,同时保持它们相互接触。第一个数字给出了用于扩大范围的乘法常数,而第二个数字给出了加法。

您可以试验expand = 中的两个值以获得您想要的结果。

另请参阅此相关问题:ggplot geom_boxplot: reduce space between x-axis categories

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多