问题描述
我正在尝试通过以下链接创建一系列类似的图表。这些图表显示了每个英国公务员等级的人口,以及每个政府部门的图表。这允许轻松比较图表以显示它们的结构。例如,我可以很快看到 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()