我想使用堆积的柱状图制作“时间轴”。我想做的是删除所有背景,所以我只有一个酒吧,没有别的。我被图表的白色背景困住了。
这是一个最小的示例:
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}
在嵌入图的序言中。不是最好的解决方案,但它可以工作。谢谢大家。
答案 0 :(得分:1)
这是一个非常有趣的问题。这是一种解决方法:不使用垂直堆叠的条形图然后将其水平翻转,我们可以简单地创建一个“常规”条形图,其中条形彼此相邻放置并具有相同的高度,但是每个条形都有一个可变宽度,等于所需时间间隔的持续时间。我们可以使用coord_fixed(expand = FALSE)
“裁剪”背景。
最好将x轴位置直接指定为ggplot()
,以便我们可以使用它们放置标签(稍后会对此进行详细说明)-这是如何为时间轴定位间隔:
让 X i 表示每个时间间隔 i 从原点到中心的距离(沿x轴)。对于每个间隔 i , X 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
,则可以获得与上图非常相似的图,但是每个间隔的实际“ x坐标”将从每个条的左边缘开始,而不是中心
这使文本标签居中非常困难,因为我们需要根据每个间隔的宽度来调整它们的位置,但是ggplot2
之类的position_nudge()
选项仅允许我们调整 all 标签保持一定的数量。因此,我们直接指定每个时间间隔的中心。希望随着ggplot2
的不断改进,我们将看到诸如position_nudge()
之类的选项获得更多功能,可以更轻松地解决此问题!