ggplot2 - 当点图不是在相同坐标上着色点时,如何应用带图例的手动渐变

Chr*_*ker 5 plot gradient r legend ggplot2

我知道我正在以一种奇怪的方式使用dotplot,但我已经得到了它生成我想要的图形; 这显示了每个英超联赛足球俱乐部每个位置有多少名球员,每个球员都有一名球员.我有多个类别 - 显示玩家是小队运动员还是青年运动员,这些是单独绘制的,第二个是轻微的,因此它们不会重叠.

我想为它添加另一层信息,根据每个玩家玩了多少分钟来点亮点.我的数据框中有这些数据.

它完美地对点进行颜色编码,除非数据是"分组"的,在这种情况下它会使其保持灰色.

我的情节的截图

我已经阅读了关于提出一个好问题的指导.我已经减少数据以显示问题,而不是很大,并删除了所有代码行,例如操纵数据到此点和图表标题等.

这是一个由20名玩家组成的样本,它们可以生成16个色彩鲜艳的点和2对灰色无色点.

structure(list(team = structure(c(2L, 3L, 4L, 4L, 5L, 6L, 8L, 9L, 11L, 12L, 5L, 6L, 7L, 10L, 12L, 12L, 1L, 4L, 5L, 7L), .Label = c("AFC Bournemouth", "Arsenal", "Brighton & Hove Albion", "Chelsea", "Crystal Palace", "Everton", "Huddersfield Town", "Leicester City", "Liverpool", "Swansea City", "Tottenham Hotspur", "West Bromwich Albion"), class = "factor"), 
role = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "U21", class = "factor"), 
name = structure(c(10L, 2L, 1L, 15L, 13L, 19L, 4L, 7L, 20L, 
8L, 17L, 9L, 18L, 11L, 3L, 6L, 14L, 5L, 12L, 16L), .Label = c("Boga", 
"Brown", "Burke", "Chilwell", "Christensen", "Field", "Grujic", 
"Harper", "Holgate", "Iwobi", "Junior Luz Sanches", "Loftus Cheek", 
"Lumeka", "Mousset", "Musonda", "Palmer", "Riedwald", "Sabiri", 
"Vlasic", "Walker-Peters"), class = "factor"), pos = structure(c(6L, 
7L, 6L, 6L, 6L, 5L, 2L, 4L, 3L, 6L, 1L, 1L, 5L, 4L, 6L, 4L, 
7L, 1L, 4L, 5L), .Label = c("2. CB", "3. LB", "3. RB", "4. CM", 
"5. AM", "5. WM", "6. CF"), class = "factor"), mins = c(11, 
24, 18, 1, 25, 10, 90, 6, 90, 20, 99, 180, 97, 127, 35, 156, 
32, 162, 258, 124)), .Names = c("team", "role", "name", "pos", "mins"), row.names = 471:490, class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码:

library(ggplot2)
ggplot()+ 
 geom_dotplot(data=u21, aes(x=team, y=pos, fill=mins), binaxis='y', stackdir="center", stackratio = 1, dotsize = 0.1, binwidth=0.75, position=position_nudge(y=-0.1)) +
 scale_fill_gradient(low="pink",high='red')
Run Code Online (Sandbox Code Playgroud)

在我的实际代码中,我再次运行ggplot行,但调用不同的数据框,使用不同的颜色渐变和不同的微调,以使点不重叠.

www*_*www 4

基本上发生的事情是那些“分组”点被视为 NA 值,因为 ggplot 正在接收相同 x,y 坐标的两个最小值,这破坏了着色机制。例如,在“team=Chelsea”和“pos=5.WM”的交点处,有两个分钟:18 和 1。以下代码/图表将 NA 值从默认的灰色更改为黄色,以显示发生的情况:

ggplot()+ 
  geom_dotplot(data=df, aes(x=team, y=pos, fill=mins), 
               binaxis='y', stackdir="center", 
               stackratio = 1, dotsize = 0.2, binwidth=0.75, 
               position=position_nudge(y=-0.1)) +
  scale_fill_gradient(low="pink",high='red',na.value="yellow") +
  theme(axis.text.x = element_text(angle=90, vjust=0.2, hjust=1, size=8))
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

这是对 geom_dotplot 的创造性测试。并不是说你不能用这种方法做你所要求的事情,而是用这种方法获得你想要的效果会过于复杂。相反,您可能会更幸运地使用 geom_jitter,它旨在处理绘制此类数据。

ggplot(df)+ 
  geom_jitter(aes(x=team, y=pos, col=mins),width = 0.2, height = 0) +
  scale_color_gradient(low="pink",high='red',na.value="yellow") +
  theme(axis.text.x = element_text(angle=90, vjust=0.2, hjust=1, size=8))
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

编辑:

如果您仍然想要带有点图的复杂版本,避免抖动,那么这也是:

cols <- colorRampPalette(c("pink","red"))

df$cols <- cols(
  max(df$mins,na.rm=T))[findInterval(df$mins,sort(1:max(df$mins,na.rm=T)))]

ggplot()+ 
  geom_dotplot(data=df, aes(x=team, y=pos, col=mins, fill=cols), 
               binaxis='y',stackdir="centerwhole",stackgroups=TRUE, 
               binpositions="all",stackratio=1,dotsize=0.2,binwidth=0.75, 
               position=position_nudge(y=-0.1)) +
  scale_color_gradient(low="pink",high='red',na.value="yellow") +
  scale_fill_identity() +
  theme(axis.text.x = element_text(angle=90, vjust=0.2, hjust=1, size=8))
Run Code Online (Sandbox Code Playgroud)

输出:

在此输入图像描述

对于那些不太熟悉第三张图的代码中发生的事情的人:第一步是使用 colorRampPalette 存储渐变范围;步骤2根据行的df$mins值仔细地为每一行分配一个十六进制颜色值;步骤 3 使用颜色和填充参数集绘制数据,以便出现图例,而其他灰色(或黄色)分组点将被我们通过调用 scale_fill_identity() 设置的正确手动渐变颜色覆盖。通过此配置,您可以获得正确的颜色和正确的图例。