我想用ggplot2中的一行/一条来显示两点之间的差异。
假设我们有一些关于收入和支出的数据作为时间序列。 我们不仅要想象它们,还想要平衡(=收入 - 支出)。 此外,我们想说明余额是正数(=盈余)还是负数(=赤字)。
我尝试了几种方法,但没有一种产生令人满意的结果。在这里,我们使用可重复的示例。
# Load libraries and create LONG data example data.frame
library(dplyr)
library(ggplot2)
library(tidyr)
df <- data.frame(year = rep(2000:2009, times=3),
var = rep(c("income","spending","balance"), each=10),
value = c(0:9, 9:0, rep(c("deficit","surplus"), each=5)))
df
1.使用LONG数据
不出所料,它不适用于LONG数据,
因为geom_linerange
参数ymin
和ymax
无法正确指定。 ymin=value, ymax=value
肯定是错误的方式(预期的行为)。 ymin=income, ymax=spending
显然也是错误的(预期行为)。
df %>%
ggplot() +
geom_point(aes(x=year, y=value, colour=var)) +
geom_linerange(aes(x=year, ymin=value, ymax=value, colour=net))
#>Error in function_list[[i]](value) : could not find function "spread"
2.使用WIDE数据
我差点使用WIDE数据。
情节看起来不错,但缺少geom_point(s)
的图例(预期行为)。
只需将show.legend = TRUE
添加到两个geom_point即可解决问题,因为它会覆盖geom_linerange
图例。此外,我宁愿将geom_point
行代码合并为一行(参见1.Approach)。
df %>%
spread(var, value) %>%
ggplot() +
geom_linerange(aes(x=year, ymin=spending, ymax=income, colour=balance)) +
geom_point(aes(x=year, y=spending), colour="red", size=3) +
geom_point(aes(x=year, y=income), colour="green", size=3) +
ggtitle("income (green) - spending (red) = balance")
3.使用LONG和WIDE数据的方法
将1.Approach与2.Approach相结合,会产生另一个令人不满意的情节。图例不区分平衡和var(=预期行为)。
ggplot() +
geom_point(data=(df %>% filter(var=="income" | var=="spending")),
aes(x=year, y=value, colour=var)) +
geom_linerange(data=(df %>% spread(var, value)),
aes(x=year, ymin=spending, ymax=income, colour=balance))
geom
代替geom_linerange
吗? 答案 0 :(得分:5)
尝试
ggplot(df[df$var != "balance", ]) +
geom_point(
aes(x = year, y = value, fill = var),
size=3, pch = 21, colour = alpha("white", 0)) +
geom_linerange(
aes(x = year, ymin = income, ymax = spending, colour = balance),
data = spread(df, var, value)) +
scale_fill_manual(values = c("green", "red"))
主要思想是我们对颜色使用两种不同类型的美学(fill
用于点,适当的pch
和colour
用于颜色)以便我们获得每个单独的传说。