多年来,数据重叠

时间:2014-03-30 19:10:57

标签: r ggplot2 data-visualization

我试图想象过去几年里我去过的地方。

请参阅下面的代码:我希望按年(g2)进行g1研究。我是否需要在数据框中添加年终/年开始点,或者我错过了一些明显的东西?

我已尝试设置group = 1,但我并不完全确定它会尝试做什么。

我的愿景是最终输出看起来像这样:

pic1

或者,像这样,通过一些调整来映射"状态"列到geom_line

pic2

另外,请指出任何不良习惯/低效代码。

library("reshape2")
library("ggplot2")
library("scales")

travel <- structure(list(place = c("Brighton", "Madrid", "Home", "Berlin", 
                                   "Geneva", "Home", "New York & Canada", "Home", "Isle of Wight", 
                                   "Home", "Copenhagen", "Home"), day.out = c("2009-09-06", "2012-07-23", 
                                                                              "2012-07-27", "2012-11-21", "2012-11-23", "2012-11-26", "2013-04-04", 
                                                                              "2013-04-15", "2013-08-26", "2013-08-29", "2014-03-14", "2014-03-17"
                                   ), day.back = c("2012-07-22", "2012-07-26", "2012-11-20", "2012-11-22", 
                                                   "2012-11-25", "2013-04-03", "2013-04-14", "2013-08-25", "2013-08-28", 
                                                   "2014-03-13", "2014-03-16", "2014-03-30"), status = c("Live", 
                                                                                                         "Travel", "Live", "Travel", "Travel", "Live", "Travel", "Live", 
                                                                                                         "Travel", "Live", "Travel", "Live")), .Names = c("place", "day.out", 
                                                                                                                                                          "day.back", "status"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                                     -12L))
travel$day.out <- as.Date(travel$day.out)
travel$day.back <- as.Date(travel$day.back)
travel$midpoint <- travel$day.out + floor((travel$day.back-travel$day.out)/2)
travel$day.out <- as.character(travel$day.out)
travel$day.back <- as.character(travel$day.back)
travel <- melt(travel, measure.vars = c("day.out", "day.back"))
travel <- travel[order(travel$value, decreasing = TRUE), ]
travel$status <- factor(travel$status)
travel$value <- as.Date(travel$value)
travel$label <- travel$place
travel$label[seq(2, dim(travel)[1], 2)] <- ""
travel$year <- as.numeric(format(travel$value, "%Y"))
pos <- c(-2.5, 2.5)
travel$vjust <- rep(pos, times = dim(travel)[1]/4 , each = 2)
rm(pos)

g1 <- ggplot(travel, aes(y = 0, colour = place)) +
  geom_line(aes(x = value, alpha = status), size = 8) +
  geom_text(aes(x = midpoint, label = label, vjust = vjust), size = 4) +
  scale_y_continuous(breaks = NULL) +
  scale_x_date(breaks = date_breaks("1 month"), labels = date_format("%b")) +
  labs(list(title = "g1", y = "", x = "")) +
  theme_bw() +
  theme(axis.text.y = element_blank(),
        legend.position = "none")

g2 <- ggplot(travel, aes(y = 0, colour = place)) +
  geom_line(aes(x = value, alpha = status), size = 8) +
  geom_text(aes(x = midpoint, label = label, vjust = vjust), size = 4) +
  scale_y_continuous(breaks = NULL) +
  scale_x_date(breaks = date_breaks("1 month"), labels = date_format("%b")) +
  labs(list(title = "g2", y = "", x = "")) +
  theme_bw() +
  theme(axis.text.y = element_blank(),
        legend.position = "none") +
  facet_grid(year ~ .)

g1
g2

更新1

我(手动)添加了年初/年终点,这是不理想的(有编程方式吗?),这带来了一个新问题。这些日期属于Date级,所以每年半个工作(参见代码)。我和space = "free_x", scales = "free-x"一起玩过,没有成功。此外,将vjust的{​​{1}}值设置为2.5或2.5的代码已经失败了,是否有更好的方法来设置它?

geom_text

更新2

大家好,

Haven在这个问题上没有取得任何成功,也许我在最初的问题中过度阐述了?

我以为我看到有人回复过使用library("reshape2") library("ggplot2") library("scales") travel <- structure(list(place = c("Brighton", "Brighton", "Brighton", "Brighton", "Madrid", "Home", "Berlin", "Geneva", "Home", "Home", "New York & Canada", "Home", "Isle of Wight", "Home", "Home", "Copenhagen", "Home"), day.out = c("2009-09-06", "2010-01-01", "2011-01-01", "2012-01-01", "2012-07-23", "2012-07-27", "2012-11-21", "2012-11-23", "2012-11-26", "2013-01-01", "2013-04-04", "2013-04-15", "2013-08-26", "2013-08-29", "2014-01-01", "2014-03-14", "2014-03-17" ), day.back = c("2009-12-31", "2010-12-31", "2011-12-31", "2012-07-22", "2012-07-26", "2012-11-20", "2012-11-22", "2012-11-25", "2012-12-31", "2013-04-03", "2013-04-14", "2013-08-25", "2013-08-28", "2013-12-31", "2014-03-13", "2014-03-16", "2014-03-30"), status = c("Live", "Live", "Live", "Live", "Travel", "Live", "Travel", "Travel", "Live", "Live", "Travel", "Live", "Travel", "Live", "Live", "Travel", "Live")), .Names = c("place", "day.out", "day.back", "status" ), class = "data.frame", row.names = c(NA, -17L)) travel$day.out <- as.Date(travel$day.out) travel$day.back <- as.Date(travel$day.back) travel$midpoint <- travel$day.out + floor((travel$day.back-travel$day.out)/2) travel$day.out <- as.character(travel$day.out) travel$day.back <- as.character(travel$day.back) travel <- melt(travel, measure.vars = c("day.out", "day.back")) travel <- travel[order(travel$value, decreasing = TRUE), ] travel$status <- factor(travel$status) travel$value <- as.Date(travel$value) travel$label <- travel$place travel$label[seq(2, dim(travel)[1], 2)] <- "" travel$year <- as.numeric(format(travel$value, "%Y")) # pos <- c(-2.5, -2.5, 2.5, 2.5) # travel$vjust <- rep(pos, times = dim(travel)[1]/4) # rm(pos) g1 <- ggplot(travel, aes(y = 0, colour = place)) + geom_line(aes(x = value, alpha = status), size = 8) + geom_text(aes(x = midpoint, label = label), size = 4) + scale_y_continuous(breaks = NULL) + scale_x_date(breaks = date_breaks("1 month"), labels = date_format("%b")) + labs(list(title = "g1", y = "", x = "")) + theme_bw() + theme(axis.text.y = element_blank(), legend.position = "none") + facet_grid(year ~ .) g1 建议的内容,但UPDATE 1(facet_wrap类)的问题仍然存在。

1 个答案:

答案 0 :(得分:1)

你几乎就在那里!

valuemidpoint值指定了您还需要面对的年份。您需要删除&#34;年&#34;如果您希望构面正常工作,请使用这些值中的信息。我只是改变了今年的价值而不是:

travel$value <- as.Date(format(travel$value, "%m-%d"), "%m-%d")
travel$midpoint <- as.Date(format(travel$midpoint, "%m-%d"), "%m-%d")

我在vjust值中看到的唯一问题是,您尝试将它们复制34/4 =每次8.5次,这将向下舍入为8并给您一个错误。您可以使用length.out

动态设置重复次数
travel$vjust <- rep(pos, length.out=nrow(travel))

因此,您现在可以将vjust添加回代码:

g1 <- ggplot(travel, aes(y = 0, colour = place)) +
  geom_line(aes(x = value, alpha = status), size = 8) +
  geom_text(aes(x = midpoint, label = label, vjust=vjust), size = 4) +
  scale_y_continuous(breaks = NULL) +
  scale_x_date(breaks = date_breaks("1 month"), labels = date_format("%b")) +
  labs(list(title = "g1", y = "", x = "")) +
  theme_bw() +
  theme(axis.text.y = element_blank(),
        legend.position = "none") +
  facet_grid(year ~ .)

Corrected output

希望这有帮助!