2017-09-17 40 views
5

我知道我以稍微奇怪的方式使用点图,但是我已经生成了图形I想;其中显示了每个英超足球俱乐部在每个位置有多少球员,每个点显示一名球员。我有多个类别 - 显示球员是小队球员还是青少年球员,这些是分开绘制的,第二种是微调的,因此它们不会重叠。ggplot2 - 如何在点图不在相同坐标上着色点时如何将图例应用为手动渐变

我想添加另一层信息,它是根据每个玩家玩过多少分钟来渲染点。我在我的数据框中有这些数据。

它完美的颜色编码的点,除非数据是“分组”,在这种情况下,它使它灰色。

screenshot of my plot

我读过产生良好的R第指导。我已经减少了数据,以显示问题,而不是巨大的,并删除了所有代码行,如操纵数据到这一点和图形标题等。

这是一个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") 

这里是我使用的代码:

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

在我实际的代码我然后再次运行ggplot线,但调用不同的数据帧,用不同的颜色渐变,和不同微调,使点不重叠。

回答

3

基本上发生了什么是那些“分组”的点被视为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)) 

输出:

enter image description here

这是geom_dotplot的创意测试。这并不是说你不能用这种方法去做你想要的东西,但是用这种方法获得你想要的效果会过于复杂。相反,geom_jitter可能会带来更多运气,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)) 

输出:

enter image description here

编辑:

如果你还是想用散点图复杂的版本,避免抖动,那么这里太:

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

输出:

enter image description here

对于那些不太熟悉正在发生的事情在代码为第三曲线:步骤1是存储与colorRampPalette梯度范围;步骤2根据行的df $ mins值小心地为每行分配一个十六进制颜色值;步骤3使用颜色和填充参数集来绘制数据,以便出现图例,但其他灰色(或黄色)分组点用我们通过调用scale_fill_identity()设置的正确手动渐变颜色叠加。通过这种配置,您可以获得正确的颜色和正确的图例。

+0

嗨,感谢您的帮助,它确实适用于这个示例,但是当我在完整的数据框上尝试它时(约460分),看起来非常混乱,因为由于抖动的随机性,增加比4更多的空间,因此视觉失去了'一目了然'的性质。颜色编码错误虽然是解决问题的好主意。谢谢@RyanRunge –

+0

@ChrisBaker - 够公平的。我决定添加复杂的选项来帮助您的特定用例。请参阅上面的修改。 – www

+0

@ChrisBaker - 如果回答您的问题,请记得点击此解决方案旁边的复选标记。它有助于社区知道它已经得到解决,并且帮助其他人在同一问题中找到更快的答案。 – www

相关问题