2017-09-17 10 views
5

약간 이상한 방식으로 점 플롯을 사용하고 있지만 그래픽을 생성하고 있음을 알고 있습니다. 필요; 각 프리미어 리그 축구 클럽의 각 포지션에서 얼마나 많은 플레이어가 있는지를 보여줍니다. 나는 선수가 분대 선수인지 청소년 선수인지를 보여주는 여러 범주를 가지고 있는데, 이들은 두 선수가 겹쳐지지 않도록 두 번째 선수가 따로 꾸몄다.ggplot2 - 도트 플롯이 같은 좌표에서 채색 점이 아닌 경우 범례와 함께 수동 그래디언트를 적용하는 방법

각 플레이어가 플레이 한 시간을 기준으로 점을 음영 처리하는 또 다른 정보 레이어를 추가하고 싶습니다. 데이터 프레임에이 데이터가 있습니다.

데이터가 "그룹화"되어 있지 않은 경우를 제외하고는 회색으로 표시됩니다.

screenshot of my plot

는 내가 좋은 연구 질문 생산에 지침을 읽었습니다. 거대한 데이터가 아닌 문제를 보여주기 위해 데이터를 줄였으며이 시점과 그래프 제목 등으로 데이터를 조작하는 것과 같은 모든 코드 행을 제거했습니다.

이것은 20 명의 플레이어로 이루어진 샘플로, 16 멋지게 착색 된 도트 및 2 쌍의 회색, 무색 점. 내 실제 코드에서

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 줄을 실행하지만, 다른 색의 그라데이션으로 다른 데이터 프레임을 호출하고 다른 : 여기

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

은 내가 사용하고 코드입니다 점들이 겹치지 않도록 찔러주세요.

답변

3

기본적으로 ggplot은 채색 메커니즘을 깨고있는 동일한 x, y 좌표에 대해 2 분의 값을 받기 때문에 "그룹화 된"점은 NA 값으로 처리됩니다. 예를 들어 "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를 사용하면이 유형의 데이터 플로팅을 처리하도록 설계된 행운을 누릴 수 있습니다.

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

편집 :

여전히 지터를 방지 dotplot와 복잡한 버전을 원한다면, 여기 너무입니다 :

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 값에 따라 각 행에 16 진수 색상 값을 신중하게 지정합니다. 3 단계에서는 색상 및 채우기 인수를 모두 사용하여 데이터를 표시하여 범례가 표시되도록하고 회색 (또는 노란색) 그룹 도트는 scale_fill_identity()를 호출하여 설정 한 올바른 수동 그래디언트 색상으로 겹쳐집니다. 이 구성을 사용하면 올바른 색상과 올바른 범례를 얻을 수 있습니다.

+0

안녕하세요, 귀하의 도움에 감사드립니다, 그 샘플에서 작동하지만 전체 데이터 프레임 (약 460 점)에서 그것을 시도하면 지터의 임의 특성으로 인해 때로는 3 명의 플레이어가 걸릴 것처럼 매우 엉망으로 보입니다. 4보다 많은 공간을 확보하여 시각적으로 '한눈에'자연을 잃어 버리게됩니다. 색상 코딩 오류는 문제 해결을위한 훌륭한 아이디어입니다. 고마워요 @ RyanRunge –

+0

@ChrisBaker - 충분히 공평합니다. 특정 유스 케이스에 도움이되는 복잡한 옵션을 추가하기로 결정했습니다. 위의 편집을 참조하십시오. – www

+0

@ChrisBaker - 귀하의 질문에 답이있는 경우이 해결책 옆에있는 체크 표시를 클릭하십시오. 커뮤니티에서 문제가 해결되었다는 것을 알게되고, 같은 질문을 가진 다른 사람들이 자신의 답을 더 빨리 찾을 수있게 도와줍니다. – www