繁体   English   中英

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

[英]How to remove ggplot2 background and crop margins around geom_col

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

这是一个最小的示例:

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

给我一个酒吧,但背景广阔 在这里显示

(我已经注释掉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):

在此处输入图片说明

我现在要做的就是减小高度(如图所示),使其更像我的原始条形。 我该如何改变?

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

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

在嵌入图的序言中。 不是最好的解决方案,但它可以工作。 谢谢大家。

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

最好是直接将ggplot()指定x轴位置,以便我们可以使用它们放置标签(稍后会对此进行详细说明)-这是如何为时间轴定位时间间隔:

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

我已经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

输出:

时间线图

工作原理:

ggplot2版本3.1.0开始,我们最初陷入了困难的境地:如果选择使用coord_flip()我们可以获得水平时间轴,但是我们无法(轻松地)调整绘图区域的大小以具有所需的尺寸。 如果改为使用coord_fixed(expand = FALSE) ,则具有所需的打印边距,但由于coord_fixed()coord_flip()不兼容,因此我们无法轻松地制作水平的条形“堆栈”。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM