我有一个数据集,其中包含两年内提出的问题。每个问题都有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
欢迎使用不同的可视化方法。
答案 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")
使用这种美学编码,您可能不需要图例,并且向线段添加箭头也可能是多余的,但我已将它们留下来进行说明。
答案 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')
答案 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())
答案 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
答案 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()