【问题标题】:Add a line linking through top points of each bar to show the trend in R添加一条连接每个条形顶部的线以显示 R 中的趋势
【发布时间】:2016-01-23 13:08:56
【问题描述】:

我已经绘制了一个条形图,现在我想添加一条曲线,穿过每个条形的顶点,以便更清楚地播种变化趋势。

数据框的格式如下:

v1              v2
a               10
b               6
c               7
...

这是我绘制条形图的代码:

ggplot(date_count, aes(V1,V2)) + geom_bar(stat = "identity")+  theme(axis.text.x  = element_text(angle=45, hjust = 1,vjust = 1)) +xlab("date") + ylab("Number of activity")

我尝试过+geom_line()geom_smooth(),但都失败了。你有什么主意吗?提前致谢。

【问题讨论】:

  • 如果您使用 iris 等公共数据集生成示例会很好。
  • 此外,条形图的底点通常为零。正如 CAFEBABE 所建议的那样,请提供一个(可重复的最小示例)[stackoverflow.com/questions/5963269/… 或您尝试过的内容。
  • 谢谢。一个可重现的示例应该从加载所需的包开始,然后包括(部分)数据集(例如date_count <- structure(.......date_count <- read.table(......。但无论如何。如果您将+ geom_line(aes(group=1), colour="red") + geom_point(color="red", size=5) 添加到您的绘图代码中呢?仍然不确定您的期望的结果应该是这样的。
  • @lukeA 感谢您的回复。是的,它有效!

标签: r plot


【解决方案1】:

假设您指的是柱的顶部而不是底部,因为底部都为零。我们使 X 轴连续而不是离散,为了能够看到添加的线条,我们将条形设为白色。

# input data in reproducible form   
Lines <- "V1 V2
a               10
b               6
c               7"
date_count  <- read.table(text = Lines, header = TRUE)

library(ggplot2)

n <- nrow(date_count)

ggplot(date_count, aes(x = 1:n, y = V2)) + 
    geom_bar(stat = "identity", fill = "white") +  
    theme(axis.text.x  = element_text(angle=45, hjust = 1, vjust = 1)) +
    xlab("date") + 
    ylab("Number of activity") +
    scale_x_continuous(breaks = 1:n, labels = date_count$V1) +
    geom_line() + 
    geom_smooth(lty = 2)

【讨论】:

  • 这不是假设每个V1值只出现一次吗?但是,在aes 中使用as.numeric 和在scale_x_countinouse 中使用levels 很容易解决此问题。
  • 每个都出现一次是问题的假设,因为 (1) 数据示例显示了这一点,并且 (2) 它正在使用 stat = "identity"
  • 前者确实是一种暗示。然而,后者是恕我直言不是一个论点。当一个值多次出现时,“身份”映射也是有道理的。当您添加a 5 并比较结果时,您可以看到差异
  • 几乎不可能有人会创建一个包含两个具有相同标签的条形图的条形图。
  • 您的代码正在做什么。正常行为是求和(身份)或计数。但是,您通过为原始数据集中的每一行指定一个唯一编号来分隔这些值。反过来,如果您使用标准 mtcars 数据集,则您的代码与 TO 代码的工作方式不同,该数据集也已在 ggplot 文档中使用。只需尝试从那里复制顶部有线条的示例。
【解决方案2】:

我对你的“底线”有点困惑。我假设您的意思是每个组的最小点。

使用更大的数据样本更容易重现。因此,我使用mtcars

我将“底部”解释为此处的最小点

  aggregate(mpg ~ cyl , mtcars, function(x)min(x))
      cyl  mpg
    1   4 21.4
    2   6 17.8
    3   8 10.4

您可以通过以下方式生成绘图:

data(mtcars)
ggplot(mtcars, aes(x=cyl,y=mpg))+
      geom_bar(stat="identity")+ 
      stat_summary(fun.y=min ,geom="line",color="red")+
       stat_summary(fun.y=sum ,geom="line",color="blue")

红线是使用stat_summary 在每个组的最小值处绘制的 - 正如您在底部所写的那样。蓝线是每组的顶部(总和)。

【讨论】:

  • 很抱歉,我的问题描述有误。现在我已经编辑了它。感谢您的回答,它确实有效!
  • 但是,你接受了另一个?从我的 cmets 可以看出,它们都不同。
猜你喜欢
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 1970-01-01
相关资源
最近更新 更多