如何删除geom_col周围的ggplot2背景和裁剪边距

我想使用堆积柱形图制作“时间轴”.我想要做的是删除所有背景,所以我只有一个酒吧,没有别的.我被困在图表的白色背景中.

这是一个最小的例子:

mytheme <-  theme(
        axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        #panel.background = element_blank()
)

Name <- c("One", "Two", "Three", "Four")
value <- c(2, 5, 7, 8)

df <-  data.frame(Name, value)

ggplot(df)+
  aes(x= "Name", y = value,  fill = Name) +
  geom_col(width = .1, show.legend = FALSE) + 
  xlab("") + ylab("") +
  coord_flip() +
  mytheme

给我一个酒吧,但在一个大背景《如何删除geom_col周围的ggplot2背景和裁剪边距》.

(我已经注释掉了panel.background只是为了显示背景的范围.我想“裁剪”那个白色背景,所以我只有条形或者只是在酒吧周围的一个小空间.请帮忙.

更新

在@Gregor的建议之后,我修改了代码ggplot,如下所示:

ggplot(df)+
  aes(x= "Name", y = value,  fill = Name) +
  geom_col(width = .1, show.legend = FALSE) + 
  xlab("") + ylab("") +
  coord_flip(expand = FALSE) +
  mytheme

结果是一个非常宽的栏(页面高,因为我使用了coord_flip):

《如何删除geom_col周围的ggplot2背景和裁剪边距》

我现在需要做的就是降低高度(如图所示),使其更像我原来的酒吧.我怎么能改变呢?

我终于找到了一个简单的解决方当我使用R Markdown时,我使用了:

```{r, ..., fig.width=4, fig.height=.3}

在嵌入式数字的序言中.不是最好的解决方案,但它确实有效.谢谢大家.

最佳答案 这是一个非常有趣的问题.这是解决这个问题的一种方法:我们可以简单地创建一个“常规”条形图,其中条形图彼此相邻放置并具有相同的高度,而不是使用垂直堆叠的条形图然后水平翻转它,但每个条形图都有一个可变宽度,等于所需时间间隔的持续时间.我们可以使用coord_fixed(expand = FALSE)“裁剪”背景.

如果我们直接为ggplot()指定x轴位置,这可能是最好的,这样我们就可以使用它们来放置我们的标签(稍后会详细介绍) – 这里是如何定位时间轴的间隔:

设Xi表示从每个时间间隔i的原点到中心的距离(沿x轴).对于每个间隔i,Xi是先前时间间隔X0:Xi-1的长度的总和,加上Xi的长度的一半.我们可以通过添加使用滞后累积和的列来自动为我们生成这些值,如下所示.

我已经将panel.background = element_blank()注释掉了,这样你就可以确认我们确实获得了“只是时间轴”,没有背景.

码:

library("tidyverse")

mytheme <-  theme(
  axis.title.x=element_blank(),
  axis.text.x=element_blank(),
  axis.ticks.x=element_blank(),
  axis.title.y=element_blank(),
  axis.text.y=element_blank(),
  axis.ticks.y=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank(),
  #panel.background = element_blank()
)

Name <- c("One", "Two", "Three", "Four")
Value <- c(2, 5, 7, 8)

df <-  data.frame(Name, Value) %>%
  mutate(Name = factor(Name, levels = Name),
         xPos = cumsum(lag(Value, default = 0)) + Value/2) # calculate interval position

ggplot(data = df, aes(x = xPos, y = 1, width = Value, fill = Name)) +
  geom_col(position = "identity",
           show.legend = FALSE) +
  geom_text(aes(label = Name),
            position = position_fill(vjust = 0.5)) +
  coord_fixed(expand = FALSE) + # crop background around geom_col()
  mytheme

输出:

《如何删除geom_col周围的ggplot2背景和裁剪边距》

为什么会这样:

从ggplot2版本3.1.0开始,我们最初陷入困境之中:如果我们选择使用coord_flip(),我们可以得到一个水平时间轴,但是我们不能(轻松地)调整我们的绘图区域的大小以获得我们想要的尺寸.如果我们改为使用coord_fixed(expand = FALSE),我们有所需的绘图边距,但是我们不能轻易地形成条形的水平“堆叠”,因为coord_fixed()与coord_flip()不兼容.

有一个名为position_dodge2()的有趣参数,您可以使用geom_col()将可变宽度的条形放在彼此相邻的位置.如果设置padding = 0,则可以获得与上面看到的非常相似的绘图,但每个间隔的实际“x坐标”将从每个条的左边缘开始,而不是中心.

这使得文本标签居中非常困难,因为我们需要根据每个间隔的宽度来调整它们的位置,但像position_nudge()这样的ggplot2选项只允许我们将所有标签调整一些恒定的量.因此,我们直接指定每个时间间隔的中心.希望随着ggplot2的不断改进,我们将看到像position_nudge()这样的选项获得更多功能来更轻松地处理这个问题!

点赞