绘制分离组的时间序列条形图

时间:2017-11-04 11:51:59

标签: r plot ggplot2 time-series

我想绘制每个城市的每月计数和观察总和。我的日期变量是ym(我已将其转换为几个月,因此某些观察结果可能具有相同的ym和城市值),city列中有2个城市,每个观察点都有一个数字。

我希望每个月都有2个酒吧。在一个图中将有一个观察计数,在另一个图中,每个月和每个城市将有number列的总和。

我在计数图中使用了以下代码:

library(ggplot2)
ggplot(data = df, 
   aes(x = ym, group = city, fill = city)) +
geom_bar(position = "dodge") 

enter image description here

但收到了以下警告:

  

position_dodge需要不重叠的x间隔

我的示例数据框如下:

df <- data.frame(city = c("JLM", "JLM", "JLM", "JLM", "JLM", "TLV", "JLM", "JLM", "JLM", 
                      "JLM", "JLM", "JLM", "JLM", "JLM", "JLM", "JLM", "TLV", "JLM", 
                      "JLM", "JLM", "JLM", "JLM", "JLM", "JLM", "JLM", "TLV", "JLM", 
                      "JLM", "JLM", "JLM", "JLM", "TLV", "JLM", "JLM", "JLM", "JLM", 
                      "JLM", "TLV", "JLM", "JLM", "JLM", "JLM", "JLM", "JLM", "JLM", 
                      "JLM", "TLV", "JLM", "JLM"),
             ym = structure(c(16679, 16709, 16709, 16709, 16709, 16709, 16709, 
                              16709, 16709, 16709, 16709, 16709, 16709, 16709, 16709, 16740, 
                              16740, 16740, 16740, 16740, 16770, 16770, 16770, 16770, 16770, 
                              16801, 16801, 16801, 16832, 17136, 16861, 16861, 16861, 16861, 
                              16892, 16922, 16922, 16953, 17014, 17045, 17075, 17136, 17167, 
                              17226, 17257, 17257, 17257, 17287, 17318), class = "Date"),
             number = c(1, 4, 1, 1, 1, 5, 1, 2, 3, 1, 2, 1, 18, 1, 2, 1, 3, 4, 1, 1, 
                        1, 2, 14, 4, 1, 10, 1, 1, 3, 2, 2, 12, 1, 1, 20, 2, 2, 20, 1, 
                        2, 7, 3, 21, 2, 3, 3, 4, 2, 5))

1 个答案:

答案 0 :(得分:1)

为解决这个问题,有一些问题在复杂化。

使用原始格式,图表不会绘制number列:它所做的只是显示ym列的计数。所以我认为错误信息源于此。例如,您在2015-10-01上进行了14次观察。

要修复图表,您需要指定y轴值并为条形图提供stat="identity"参数:

ggplot(data = df, aes(x = ym, y = number, fill = city))  +
   geom_bar(stat="identity", position="dodge")

enter image description here

但仍有一些问题:

  • 位置=&#34;闪避&#34;如果在绘图之前数据没有被聚合,那么它将无法正常工作。您可以看到,对于2015-10-01,它显示的值为18.如果查看数据框,这是最大值,而不是总和(即38)。
  • 您会注意到条的宽度不同。如果一个日期有两个观察结果,一个是JLM和TLV,它会缩小标准。如果只有一个观察,它将全宽打印。

要纠正这些问题,您需要在原始数据框中包含0个值并聚合数据,这样每个类别每天只能观察一次:

library(tidyverse)    
df_fill <- dcast(df, ym ~ city, fun.aggregate = sum) %>% melt(. , id = "ym")

如果我们这样做:

ggplot(data = df_fill, aes(x = ym, y = value, fill = variable))  +
  geom_bar(stat="identity", position="dodge")

enter image description here