gpt4 book ai didi

r - 用ggplot2可视化两点之间的差异

转载 作者:行者123 更新时间:2023-12-04 18:59:50 24 4
gpt4 key购买 nike

我想用 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参数 yminymax无法正确指定。 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(s) 不能解决问题,因为它叠印了 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")

2.Approach

3.使用LONG和WIDE数据的方法

将 1.Approach 与 2.Approach 结合会导致另一个不令人满意的情节。图例不区分 balance 和 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))

3.Approach
  • 有什么(优雅的)方法可以摆脱这种困境?
  • 我应该用其他的 geom而不是 geom_linerange ?
  • 我的数据格式正确吗?
  • 最佳答案

    尝试

    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"))

    输出:
    enter image description here

    主要思想是我们对颜色使用两种不同类型的美学( fill 用于点,适当的 pchcolour 用于线),以便我们为每个得到单独的图例。

    关于r - 用ggplot2可视化两点之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40299856/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com