使用ggplot geom_line可视化两年之间的差异

gof*_*idh 2 r ggplot2

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

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
Run Code Online (Sandbox Code Playgroud)

目标是可视化每年指数之间的差异,并显示其是否遵循减少或增加的趋势.我自己的尝试如下.我试图使用ggplot2来形象化,但是,你可以看到几个问题(即线条似乎是任意的,与真实的索引值无关).

    b = ggplot(pfindex2narrow, aes(x = variable, y = value, group = Origin)) + 
  geom_line() + 
  geom_text(aes(label=value, hjust = 0.5), size = 4)
b + facet_wrap(~ Origin, ncol = 2) + 
  theme(
    axis.text.x = element_text(angle = 45, vjust = 0.5, hjust = 0.5),
    axis.text.y = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    axis.ticks = element_blank(),
    panel.grid.major.y = element_blank(),
    panel.grid.minor.y = element_blank(),
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank()
  )
Run Code Online (Sandbox Code Playgroud)

这是输出:

输出上面的代码

可悲的是,我没有想法如何解决这个问题,我有点卡住了.也许你有任何想法如何处理这个问题.

谢谢!

Axe*_*man 6

以下是一些选项:

首先,让我们缩短数据名称,以减少打字和更容易阅读.我还对数据进行了重新排序,因此更容易快速掌握正在发生的事情.

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

我们可以制作一个线条图,但看起来很混乱:

ggplot(d, aes(x = variable, y = value, col = Origin, group = Origin)) + 
  geom_line(size = 1) + 
  scale_x_discrete(expand = c(0.1, 0), limits = c('2013', '2014', 'country')) +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我不是真正的粉丝.(如果我们改为绘制国家行列,那看起来会好得多.)

也许我们可以使用吧:

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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

已经更好了!但是0到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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

最后,如果只有变化很重要,而不是绝对值,我们可以表达:

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')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述