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

3

我正在尝试可视化一个数据集,其中包含许多个国家,每个国家有两年的变量和每年的值(世界新闻自由指数)。我已经在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进行可视化,但是,正如您所看到的,存在一些问题(即线条似乎是任意的,与真实的指数值无关)。

    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()
  )

以下是输出结果:

代码的输出结果

很遗憾,我已经无法想到如何解决这个问题了,感觉有些困难。也许你有什么好的方法可以尝试一下。

谢谢!


你的代码绘制的图形看起来与我的不太一样,你是否使用了 scales = free 或者改变了坐标轴的某些设置? - Axeman
嗯,我不确定你指的有多不同?你是说这些线条有不同的角度吗?我没有使用scales = free,但也许默认情况下使用了它?嗯,我真的不确定为什么会发生这种情况,但我认为这可能是因为我没有将我的数据设置为因子,然后像你在开头所做的那样对这些因子进行排序。有趣的是,当我在新环境中再次运行相同的代码时,结果又略有不同的角度。 - gofraidh
1个回答

8

以下是几个选项:

首先,让我们将数据名称缩短一些,以减少打字并更容易阅读。我还重新排列了数据,这样可以更快地了解正在发生的情况。

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 = 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()

enter image description here

我不是很喜欢这种方式。(如果我们绘制国家的排名,它可能会更好看。)

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

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))

enter image description here

已经进步了!但是,将条形图变为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))

enter image description here

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

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')

enter image description here


非常好,非常感谢。我真的很欣赏这两个解决方案,但我仍然想知道为什么我的线图有如此混乱的刻度,我猜测没有排序和设置因素可能是原因?我还将尝试使用您的第一个解决方案。再次感谢! - gofraidh
你可以按照大陆或类似的方式对第一个进行分类。 - Axeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接