R 使用ggplot geom_线可视化两年之间的差异

R 使用ggplot geom_线可视化两年之间的差异,r,ggplot2,R,Ggplot2,我试图将一个包含国家数量的数据集形象化,每个国家都有两年的变量和每年的值(世界新闻自由指数)。我已经在stackoverflow和其他网站上搜索了答案,但我找不到任何对我有帮助的东西。 这是使用ddplyr melt后的数据集: pfindex2narrow = reshape2::melt(pfindex2, id.vars = 'Origin') pfindex2narrow Origin variable value 1 Eritrea

我试图将一个包含国家数量的数据集形象化,每个国家都有两年的变量和每年的值(世界新闻自由指数)。我已经在stackoverflow和其他网站上搜索了答案,但我找不到任何对我有帮助的东西。 这是使用ddplyr melt后的数据集:

pfindex2narrow = reshape2::melt(pfindex2, id.vars = 'Origin')



 pfindex2narrow
             Origin variable value
1           Eritrea     2014 84.86
2        NorthKorea     2014 83.25
3      Turkmenistan     2014 80.83
4             Syria     2014 77.29
5             China     2014 73.55
6           Vietnam     2014 72.63
7             Sudan     2014 72.34
8              Iran     2014 72.32
9           Somalia     2014 72.31
10             Laos     2014 71.25
11         Djibouti     2014 71.04
12             Cuba     2014 70.21
13            Yemen     2014 66.36
14 EquatorialGuinea     2014 66.23
15       Uzbekistan     2014 61.14
16      SaudiArabia     2014 59.41
17          Bahrain     2014 58.69
18       Azerbaijan     2014 58.41
19           Rwanda     2014 56.57
20            Libya     2014 45.99
21          Eritrea     2013 84.83
22       NorthKorea     2013 81.96
23     Turkmenistan     2013 80.81
24            Syria     2013 77.04
25            China     2013 72.91
26          Vietnam     2013 72.36
27            Sudan     2013 71.88
28             Iran     2013 72.29
29          Somalia     2013 73.19
30             Laos     2013 71.22
31         Djibouti     2013 70.34
32             Cuba     2013 70.92
33            Yemen     2013 67.26
34 EquatorialGuinea     2013 67.95
35       Uzbekistan     2013 61.01
36      SaudiArabia     2013 58.30
37          Bahrain     2013 58.26
38       Azerbaijan     2013 52.87
39           Rwanda     2013 56.57
40            Libya     2013 39.84
我们的目标是将每年指数之间的差异可视化,并显示其是呈下降趋势还是呈上升趋势。下面是我自己的尝试。我试图使用ggplot2将其可视化,但是,正如您所看到的,几乎没有问题(即,行似乎是任意的,与实际索引值无关)

这是输出:

可悲的是,我没有办法解决这个问题,我有点被卡住了。也许你对如何处理这个问题有什么想法

谢谢大家!

以下是一些选项:

首先,让我们将数据名缩短一点,以减少键入和易于阅读。我还对数据进行了重新排序,因此更容易快速掌握情况

d <- pfindex2narrow
d$variable <- factor(d$variable)
d$Origin <- factor(
  d$Origin, 
  levels = (d$Origin)[rev(order(d$value[d$variable == '2014']))]
)

我不是一个真正的粉丝。(如果我们能画出国家的排名,情况可能会好得多。)

也许我们可以用条形图代替:

ggplot(d, aes(x = Origin, y = value, fill = variable)) + 
  geom_bar(stat = 'identity', position = 'dodge') + 
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

已经好多了!但是0的条可能没有很好地利用我们的空间。另一种选择是使用点

d2 <- d
d2$x <- as.numeric(d2$Origin) + ifelse(d2$variable == '2013', -0.25, 0.25)
ggplot(d2, aes(x = Origin, y = value, col = variable)) + 
  geom_point(position = position_dodge(w = 1)) +
  geom_line(aes(x = x, group = Origin), col = 1) +
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))
d2%
汇总(dif=差异(值))%>%
安排(dif)

d3$Origin我从你的代码中绘制出来的图看起来很不一样,你是使用了
scales=free
还是以某种方式改变了轴?嗯。我不确定你的意思有多大不同?你是说线条有不同的角度吗?我没有使用scales=free,但它可能是默认使用的?好。我真的不知道为什么会发生这种情况,但我认为这是因为没有将我的数据设置为因子,然后像开始时那样对这些因子进行排序,有趣的是,当我在新环境中再次运行相同的代码时,再次导致角度略有不同。这非常好,非常感谢。我真的很欣赏最后两种解决方案,我仍然想知道为什么我的线图有如此混乱的比例,我认为没有排序和设置因素可能是原因?我也会尝试你的第一个解决方案。再次感谢你!你可以按大陆或类似的东西来划分第一个。
ggplot(d, aes(x = Origin, y = value, fill = variable)) + 
  geom_bar(stat = 'identity', position = 'dodge') + 
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))
d2 <- d
d2$x <- as.numeric(d2$Origin) + ifelse(d2$variable == '2013', -0.25, 0.25)
ggplot(d2, aes(x = Origin, y = value, col = variable)) + 
  geom_point(position = position_dodge(w = 1)) +
  geom_line(aes(x = x, group = Origin), col = 1) +
  theme_bw() + 
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))
library(dplyr)
d3 <- d %>% 
  group_by(Origin) %>% 
  arrange(variable) %>% 
  summarize(dif = diff(value)) %>% 
  arrange(dif)
d3$Origin <- factor(d3$Origin, levels = unique(d3$Origin))

ggplot(d3, aes(Origin, dif, fill = Origin)) + 
  geom_bar(stat = 'identity', position = 'identity') +
  coord_flip() +
  theme_minimal() +
  guides(fill = 'none') +
  xlab('') + ylab('change from 2013 to 2014')