【问题标题】:Barchart/line graph with ggplot2带有ggplot2的条形图/折线图
【发布时间】:2017-10-22 15:36:16
【问题描述】:

我刚开始学习 R,遇到了关于图构建的问题。

我有一个 df,其中 str(df) 给出了

Date : chr  
Hour : int  
Street 1: int  
Street 2: int  
..  
Street 15: int  

其中日期是一个月中的每一天,小时是一天中的每一个小时,街道数据显示一天中该小时街道的交通量。

我想在 ggplot 上制作一个条形图,显示一个月内每条街道的交通总量,以显示交通流量最大的街道,但是当我尝试使用 ggplot 制作图表时,还包括小时数据破坏图表。

我查看了已经针对堆栈溢出提出的各种问题,并尝试融合数据,但要么我做错了,要么它不适合我的数据,因为它仍然不起作用。
通过这样做,我能够达到一个非常简单的解决方案:

df2 <- colSums(df[3:15], na.rm = TRUE)  
barplot(df2, las=2, xlab="Street", ylab="Amount of People", main="Pedestrian Traffic For January", cex.lab=0.75, ylim=c(0,1500000))  

但是这个图表非常基础,我不能修改 x 轴标签。

我还想制作一个折线图,显示一条街道每小时的交通总量,但我认为因为有多个小时的数据值(例如 1/1 的第 1 小时的数据,然后 2/1 的第 1 小时的数据等)折线图不显示一条线。

编辑:
head(df): 街道比较多,但是为了格式化,我只贴了前3条街道的数据。

    Date       Hour     Street 1                Street 2            Street 3
1 01/01/2014    0          1544                   893                   404
2 01/01/2014    1          1401                   224                   179
3 01/01/2014    2           608                   127                    97
4 01/01/2014    3           360                   108                    74
5 01/01/2014    4           156                    75                    33
6 01/01/2014    5            69                    20                     8

【问题讨论】:

  • 请发帖head(df)
  • 编辑于 head(df)

标签: r ggplot2


【解决方案1】:

因为我没有你使用的实际数据,所以我只是生成了一个随机数据集。

require(tidyverse)

# Random Data
df <- data.frame(date = seq(31), hour = rep(seq(24), 31), Street1 = 
                                        rpois(24*31, 5), 
                                        Street2 = rpois(24*31, 10),
                                        Street3 = rpois(24*31, 15))

# Transform to long format
df %>%
  gather(key, value,-date, -hour) -> df

# Create bar chart
g <- ggplot(df, aes(x = as.factor(key), y = value))
g <- g + geom_bar(stat="identity")
g <- g + xlab("Street") + ylab("Pedestrian Traffic for January")
g

此代码将输出以下 Plot:

您可以通过更改“key”列的因子标签轻松更改 x 标签。

可以通过以下代码创建折线图:

# Summarize the hourly data
df %>%
  group_by(date,key) %>%
  summarise(value = sum(value)) -> df

g <- ggplot(df, aes(x = date, y = value, color = key))
g <- g + geom_line()
g

这将输出以下图表:

【讨论】:

  • 感谢您的帮助。我可以按照您的代码进行操作,但是有一个问题,我的 df 的日期是字符格式而不是整数,因此它不允许我像您的示例那样转换为长格式。我尝试使用 as.integer 将其转换为整数格式,因此它与您的示例相同,但转换后它给了我 NA 。我认为问题在于日期数据类似于“01/01/2014”。
  • 您可以使用 lubridate 包进行简单的日期转换。如果将日期变量转换为正确的格式,它应该可以正常工作: require(lubridate) df %>% mutate(date = ymd(date) -> df
  • 我明白了。再次感谢您的帮助。