ggplot2:用箭头显示值随时间的差异

时间:2016-06-29 16:07:48

标签: r ggplot2

我有一个数据集,其中包含两年内提出的问题。每个问题都有2015年的价值和2016年的价值。我想绘制每个,然后显示2015年价值和2016年价值之间的差异。得分是上升还是下降或保持不变?我认为用线(或箭头)连接点对来显示变化的方向可能是有用的,但是我很难让ggplot这样做。这是我的代码示例:

df <- read.table(text = "question y2015 y2016
q1 90 50
q2 80 60
q3 70 90
q4 90 60
q5 30 20", header = TRUE)

g1 <- ggplot(df, aes(x=question))
g1 <- g1 + geom_point(aes(y=y2015, color="y2015"), size=4)
g1 <- g1 + geom_point(aes(y=y2016, color="y2016"), size=4)
g1

欢迎使用不同的可视化方法。

5 个答案:

答案 0 :(得分:4)

如果您逐字逐句地将年份放在x轴上,您可以用颜色突出显示趋势方向,并使用x轴显示时间的推移。

library(reshape2)
library(dplyr)
library(ggthemes)

ggplot(df %>% melt(id.var="question") %>% 
         group_by(question) %>% 
         mutate(Direction=ifelse(diff(value)>0,"Up","Down")), 
       aes(x=gsub("y","",variable), y=value, color=Direction, group=question)) + 
  geom_point(size=2) + 
  geom_path(arrow=arrow(length=unit(0.1,"in")), show.legend=FALSE) +
  facet_grid(. ~ question) +
  theme_tufte() +
  theme(strip.text.x=element_text(size=15)) +
  guides(color=guide_legend(reverse=TRUE)) +
  scale_y_continuous(limits=c(0,100)) +
  labs(x="Year", y="Value")

使用这种美学编码,您可能不需要图例,并且向线段添加箭头也可能是多余的,但我已将它们留下来进行说明。

enter image description here

答案 1 :(得分:3)

我认为&#34;哑铃&#34;图表也可以。在这里,我将您的数据重新塑造了很长时间。

df <- read.table(text = "question y2015 y2016
q1 90 50
q2 80 60
q3 70 90
q4 90 60
q5 30 20", header = TRUE)

df.long <- 
  reshape(df, varying = names(df)[2:3],
        direction = 'long',
        #ids = 'question',
        times = 2015:2016,
        v.names = 'perc',
        timevar = 'year'
        )

ggplot(df.long, aes(x = perc, y = question))+
  geom_line(aes(group = question))+
  geom_point(aes(colour = factor(year)), size = 2)+
  theme_bw()+
  scale_color_brewer(palette = 'Set1', name = 'Year')

enter image description here

答案 2 :(得分:2)

它仍然有点难看,需要微调,但它有箭头;)

library(ggplot2)
library(reshape2)
library(dplyr)

ggplot2df <- read.table(text = "question y2015 y2016
q1 90 50
                 q2 80 60
                 q3 70 90
                 q4 90 60
                 q5 30 20", header = TRUE)


df <- ggplot2df %>% 
  mutate(direction = ifelse(y2016 - y2015 > 0, "Up", "Down"))%>%
  melt(id = c("question", "direction"))


g1 <- ggplot(df, aes(x=question, y = value, color = variable, group = question )) + 
  geom_point(size=4) + 
  geom_path(aes(color = direction), arrow=arrow())

enter image description here

答案 3 :(得分:1)

也许是这样的? 需要对数据进行一些重新整形,并使用非常有用的库gather中的函数tidyr进行处理。

library(tidyr)
library(ggplot2)

g1 <- df %>% gather(year, value, y2015:y2016) %>%
ggplot(aes(x = year, y = value, color= question)) + 
    geom_point() + 
    geom_line(aes(group=interaction(question)))
g1

enter image description here

答案 4 :(得分:0)

这个网站似乎有您正在寻找的解决方案(这是一个方便的网站):

https://www.r-graph-gallery.com/connected_scatterplot_ggplot2.html

节选:

# Libraries
library(ggplot2)
library(dplyr)
library(babynames)
library(ggrepel)
library(tidyr)

# data
data <- babynames %>% 
  filter(name %in% c("Ashley", "Amanda")) %>%
  filter(sex=="F") %>%
  filter(year>1970) %>%
  select(year, name, n) %>%
  spread(key = name, value=n, -1)

# Select a few date to label the chart
tmp_date <- data %>% sample_frac(0.3)

# plot 
data %>% 
  ggplot(aes(x=Amanda, y=Ashley, label=year)) +
     geom_point(color="#69b3a2") +
     geom_text_repel(data=tmp_date) +
     geom_segment(color="#69b3a2", 
                  aes(
                    xend=c(tail(Amanda, n=-1), NA), 
                    yend=c(tail(Ashley, n=-1), NA)
                  ),
                  arrow=arrow(length=unit(0.3,"cm"))
      ) +
      theme_ipsum()

chart