使用 ggplot2 为 R 中的离散变量创建小提琴图、宇宙飞船图或类似图

问题描述

我正在尝试通过以下链接创建一系列类似的图表。这些图表显示了每个英国公务员等级的人口,以及每个政府部门的图表。这允许轻松比较图表以显示它们的结构。例如,我可以很快看到 DfID 是非常高级的,而 MOJ 的底部要重得多。

https://www.instituteforgovernment.org.uk/charts/grade-composition-and-change-department

我想在 R 中执行此操作,并且一直在使用 ggplot 试用一些解决方案。到目前为止,我已经尝试了以下方法

  • 小提琴图(不适用于垂直轴上的离散变量)
  • 折线图背靠背,一正一负,以重建形状(努力填补两者之间的空间)
  • 人口金字塔(我想要平滑的线条而不是条形)

我在下面提供了一个示例,该示例将创建一对线,显示特定球队按位置划分的平均梦幻足球得分。然后,我想在所有英超联赛球队中这样做,就像上面链接中公务员部门所做的那样。


Future<List<Location>> sortLocations() {
  ...
  return <Location>[];
}

@override
Widget build(BuildContext context) {
  return StreamBuilder<List<Location>>(
    stream: sortLocations().asstream(),builder: (context,snapshot) {
      if(snapshot.hasError) {
        return Center(child: Text(snapshot.error.toString()));
      }
      if (!snapshot.hasData) {
        return Center(child: CircularProgressIndicator()));
      }
      return ListView(...);
    },);
}

这是我现在要去的路线。我想做一些更像面积图的东西,但堆叠不允许负值。

采用这种方法仍然存在一些问题:

  • 填充线条下方的区域,使其看起来更像面积图
  • 位置现在已经乱了 - 我希望它保持“守门员、后卫、中场、前锋”的顺序。我曾尝试使用因子来执行此操作,但数据的长格式不允许使用因子,因为每个位置出现两次。

我欢迎任何关于更好方法的想法,或者我可以如何开发折线图的想法,使其看起来更像上面链接中示例中的图表。谢谢!

解决方法

为了达到您想要的结果,您可以切换到 geom_area,对于排序,您可以将 limits 设置为所需的顺序:

library(tidyverse)

position <- c('Goalkeeper','Defender','Midfielder','Forward')
average_points <- c(100,150,185,170)

football_df <- data.frame(position,average_points) %>%
  dplyr::mutate(negative_average_points = average_points * -1) %>% # create a column that shows the negative to create the mirrored line
  gather(key = key,value = average_points,-position,na.rm = TRUE) # turn into long format to create the line chart

ggplot(football_df,aes(x = position,y = average_points,group = key)) + 
  geom_area() +
  scale_x_discrete(limits = position) +
  coord_flip()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...