하나의 플롯에서 많은 변수 시각화


25

특정 변수의 값 (~ 15)이 시간이 지남에 따라 어떻게 변하는 지 보여주고 싶지만, 매년 변수가 어떻게 다른지 보여주고 싶습니다. 그래서 나는이 줄거리를 만들었습니다.

여기에 이미지 설명을 입력하십시오

그러나 색 구성표를 변경하거나 다른 선 / 모양 유형을 추가 할 때도 지저분 해 보입니다. 이런 종류의 데이터를 시각화하는 더 좋은 방법이 있습니까?

R 코드를 사용한 테스트 데이터 :

structure(list(Var = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 
6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 
8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 11L, 11L, 11L, 11L, 11L, 
11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 14L, 14L, 14L, 14L, 
14L, 14L, 14L, 16L, 16L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 
17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L), .Label = c("A", 
"B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", 
"O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"), class = "factor"), 
    Year = c(2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
    2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
    1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 
    2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
    2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
    1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 
    2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 2004L, 2011L, 
    2015L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 
    1991L, 1993L, 1996L, 2000L, 2011L, 2015L, 1991L, 1993L, 1996L, 
    2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 
    2011L, 2015L), Val = c(25.6, 22.93, 20.82, 24.1, 24.5, 29, 
    25.55, 24.5, 24.52, 20.73, 25.8, 25.5, 29.5, 27.7, 25.1, 
    25, 24.55, 26.75, 25, 30.5, 27.25, 25.1, 22.4, 27.07, 26, 
    29, 27.2, 24.2, 23, 24.27, 27.68, 27, 30.5, 28.1, 24.9, 23.75, 
    22.75, 27.25, 25, 29, 28.45, 24, 20.25, 17.07, 24.45, 25, 
    28.5, 26.75, 24.9, 21.25, 20.65, 25.1, 24.5, 26.5, 25.35, 
    23.5, 21.93, 26.5, 24.5, 29, 29.1, 26.4, 28.1, 23.75, 26.5, 
    28.05, 27, 30.5, 25.65, 23.3, 23.25, 24.57, 26.07, 27.5, 
    28.85, 27.7, 22, 23.43, 26.88, 27, 30.5, 29.25, 28.1, 23, 
    23.8, 28.32, 27, 29.5, 29.15, 27.6)), row.names = c(1L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 35L, 
36L, 37L, 38L, 39L, 40L, 41L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 
53L, 54L, 55L, 56L, 57L, 58L, 59L, 62L, 63L, 64L, 65L, 66L, 67L, 
68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 78L, 79L, 80L, 81L, 82L, 
83L, 84L, 87L, 88L, 89L, 90L, 91L, 92L, 95L, 96L, 97L, 98L, 99L, 
100L, 101L, 104L, 105L, 106L, 107L, 108L, 109L, 110L), na.action = structure(c(2L, 
3L, 11L, 12L, 33L, 34L, 42L, 43L, 51L, 52L, 60L, 61L, 76L, 77L, 
85L, 86L, 93L, 94L, 102L, 103L), .Names = c("2", "3", "11", "12", 
"33", "34", "42", "43", "51", "52", "60", "61", "76", "77", "85", 
"86", "93", "94", "102", "103"), class = "omit"), class = "data.frame", .Names = c("Var", 
"Year", "Val"))

2
데이터를 게시 할 수 있습니까? 대략 비슷한 예제를 찾는 것은 쉽지만 스레드를 묶어두면 같은 샌드 박스를 가진 사람들이 도움이 될 것입니다. 또한 녹색 지대의 중요성은 무엇입니까?
Nick Cox


@NickCox 물론, 이전에 생각했을 것입니다! 필연적으로 녹색 영역을 생략했습니다 ( "충분한"것으로 간주되는 값의 범위 만 표시)

답변:


42

우연히 또는 그렇지 않으면, 귀하의 예는 그래픽으로 문제가 있음을 보여주기 위해 먼저 최적 크기 (15 개 그룹 각각에 대해 최대 7 개의 값)입니다. 둘째, 다른 간단한 솔루션을 허용합니다. 그래프는 다른 분야의 사람들에 의해 종종 스파게티 라고 불리는 종류 의 용어이지만, 그 용어가 애정이 있거나 모욕적 인 의미인지 항상 명확하지는 않습니다. 그래프는 모든 그룹의 집단적 또는 가족적 행동을 보여 주지만, 탐구 할 세부 사항을 보여주는 것은 상당히 희망적입니다.

하나의 표준 대안은 별도의 그룹을 별도의 패널에 표시하는 것이지만, 그룹 간 정확한 비교를 어렵게 만들 수 있습니다. 각 그룹은 다른 그룹의 컨텍스트와 분리됩니다.

그렇다면 각 그룹에 대한 별도의 패널이지만 다른 그룹을 배경으로 보여주는 두 가지 아이디어를 결합하지 않겠습니까? 이것은 초점이있는 그룹을 강조하고 다른 그룹을 다운 플레이하는 데 결정적으로 달려 있습니다.이 예제에서는 선 색, 두께 등을 사용하면 충분히 쉽습니다. 다른 예에서는 마커 또는 점 기호 선택이 자연 스럽습니다.

여기에 이미지 설명을 입력하십시오

이 경우 가능한 실제적 또는 과학적 중요성 또는 관심의 세부 사항이 강조 표시됩니다.

  1. A와 M에는 하나의 값만 있습니다.

  2. 우리는 다른 모든 경우에 주어진 기간 동안 모든 가치를 가지고 있지 않습니다.

  3. 일부 그룹은 높거나 낮은 그룹 등을 나타냅니다.

나는 여기서 해석을 시도하지 않을 것입니다 : 데이터는 익명이지만, 그것은 어떤 경우에도 연구원의 관심사입니다.

소프트웨어에서 쉽게 또는 가능한 것에 따라 여기에 축 레이블과 제목의 반복 여부와 같은 작은 세부 사항을 변경할 수있는 범위가 있습니다 (간단한 인수가 있는가).

더 큰 문제는이 전략이 더 일반적으로 작동하는 정도입니다. 그룹의 수는 각 그룹의 포인트 수보다 더 큰 주요 동인입니다. 대략적으로 말하면,이 접근 방식은 최대 약 25 개의 그룹 (5 x 5 디스플레이 등)으로 작동 할 수 있습니다. 그룹이 많을수록 그래프가 작아지고 읽기가 어려워 질뿐만 아니라 연구원조차도 패널. 수백 (천, ...) 개의 그룹이 있었다면, 보여줄 작은 그룹을 선택하는 것이 필수적입니다. "전형적인"패널과 "극단적 인"패널을 선택하는 것과 같은 일부 기준이 필요합니다. 이는 프로젝트 목표와 각 데이터 세트에 적합한 것이 무엇인지에 대한 아이디어에 의해 주도되어야합니다. 효율적일 수있는 또 다른 방법은 각 패널에서 적은 수의 시리즈를 강조하는 것입니다. 그래서, 25 개의 광범위한 그룹이있는 경우 각 넓은 그룹은 다른 모든 그룹을 배경으로 표시 할 수 있습니다. 또는 평균화 또는 다른 요약이있을 수 있습니다. 주성분 또는 독립 성분을 사용하는 것도 좋습니다.

이 예에는 선 그림이 필요하지만 원칙은 당연히 일반적입니다. 곱하기, 산점도, 모델 진단 도표 등을 예로들 수 있습니다.

이 접근 방식에 대한 몇 가지 참고 자료 [다른 사람들이 가장 환영합니다] :

Cox, NJ 2010. 그래프 하위 세트. Stata Journal 10 : 670-681.

Knaflic, CN 2015. 데이터를 이용한 스토리 텔링 : 비즈니스 전문가를위한 데이터 시각화 가이드. 뉴저지 호보 켄 : 와일리.

Koenker, R. 2005. Quantile 회귀 분석. 케임브리지 : Cambridge University Press. pp.12-13 참조.

Schwabish, JA 2014. 데이터 시각화에 대한 경제학자 가이드. 경제 전망의 전표 28 : 209-234.

Unwin, A. 2015. R. Boca Raton, FL을 사용한 그래픽 데이터 분석 : CRC Press.

Wallgren, A., B. Wallgren, R. Persson, U. Jorner 및 J.-A. Haaland. 1996. 그래프 통계 및 데이터 : 더 나은 차트 만들기. Newbury Park, CA : 세이지.

참고 : 그래프는 Stata에서 생성되었습니다. subsetplot로 먼저 설치해야합니다 ssc inst subsetplot. R에서 데이터를 복사하여 붙여 넣었으며 값 레이블은 년을로 표시하도록 정의되었습니다 90 95 00 05 10 15. 주요 명령은

subsetplot connected Val Year, by(Var) c(L) lcolor(gs12) backdrop(line) xtitle("") combine(imargin(small)) subset(lcolor(blue) mcolor(blue))

추가 참조 2016 년 5 월 9 월; 2017 년 4 월, 2017 년 12 월, 2019 년 4 월 :

카이로, A. 2016. 진실 된 예술 : 데이터, 차트 및 커뮤니케이션지도. 샌프란시스코, 캘리포니아 : 새로운 라이더. p.211

Camões, J. 2016. 작업중인 데이터 : Microsoft Excel에서 효과적인 차트 및 정보 그래픽을 만들기위한 모범 사례 . 샌프란시스코, 캘리포니아 : 새로운 라이더. p.354

Carr, DB 및 Pickle, LW 2010. 마이크로 맵으로 데이터 패턴 시각화. 보카 레이턴, FL : CRC Press. p.85.

Grant, R. 2019. 데이터 시각화 : 차트,지도 및 대화식 그래픽. 보카 레이턴, FL : CRC Press. p.52.

Koponen, J. 및 Hildén, J. 2019. 데이터 시각화 핸드북. 에스 포 : Aalto ARTS Books. p.101를 참조하십시오.

Kriebel, A. and Murray, E. 2018. #MakeoverMonday : 한 번에 한 차트 씩 데이터 시각화 및 분석 방법 개선. 뉴저지 호보 켄 : 존 와일리. p.303.

Rougier, NP, Droettboom, M. 및 Bourne, PE 2014. 더 나은 인물을위한 10 가지 간단한 규칙. PLOS 전산 생물학 10 (9) : e1003833. doi : 10.1371 / journal.pcbi.1003833 여기에 링크

Schwabish, J. 2017. 더 나은 프리젠 테이션 : 학자, 연구원 및 ks 크를위한 안내서. 뉴욕 : Columbia University Press. p.98를 참조하십시오.

Wickham, H. 2016. ggplot2 : 데이터 분석을위한 우아한 그래픽. Cham : 스프링거. p.157을 참조하십시오.


+1,이 유형의 차트를 수행 할 수있는 R 또는 SAS 함수가 있습니까? 정말 좋습니다.
예측 자

나는이 아이디어를 정말로 좋아한다! ggplot2를 사용하여 R에서 이것을 그리는 가장 좋은 방법에 대해 궁금합니다. 나는 대답을 받아들이 기 전에 조금 기다릴 것입니다, 그것이 좋기를 바랍니다.

2
죄송합니다. SAS에서 어떻게해야할지 모르겠습니다. Stata가 할 수있는 모든 일, R이 나아지거나 더 잘할 수있는 것, 또는 그 사용자가 계속 나에게 말하고 있습니다 ....
Nick Cox

@ NickCox 전혀 문제가되지 않습니다, 나는 그것을 알아 냈습니다, 그것은 정말 좋아 보이고 내 목적에 완벽합니다.

@NickCox의 두 가지 참고 문헌은 다음과 같습니다. 1. WS Cleveland의 데이터 그래프 작성 요소 . 새로운 책 2. 데이터를 이용한 스토리 텔링 : Cole Nussbaumer Knaflic의 비즈니스 전문가를위한 데이터 시각화 가이드이 책 (# 2)에는 사례 연구가 있습니다. "스파게티 그래프를 피하기위한 전략"장.
예측 자

22

Nick의 답변을 보완하기 위해 시뮬레이션 데이터를 사용하여 유사한 플롯을 만드는 R 코드가 있습니다.

library(ggplot2)

get_df <- function(label="group A", n_obs=10, drift=runif(1)) {
    df <- data.frame(time=seq(1, n_obs), label=label)
    df$y <- df$time * drift + cumsum(rnorm(n_obs))
    return(df)
}
df_list <- lapply(sprintf("group %s", toupper(letters[1:9])),
                  function(label) { get_df(label) })
df <- do.call(rbind, df_list)
df$label2 <- df$label

p <- (ggplot(df, aes(x=time, y=y, group=label2)) +
      geom_line(size=0.9, alpha=0.8,
                data=df[, c("time", "y", "label2")], color="grey") +
      geom_line(size=1.1, color="black") +
      ylab("") +
      theme_bw() +
      theme(panel.border=element_blank()) +
      theme(strip.background=element_blank()) +
      facet_wrap(~ label))
p
ggsave("example_facet.png", p, width=10, height=8)

플롯 예


6

ggplot2R 의 접근 방식 을 사용 facetshade하려면 패키지 의 기능을 고려하십시오 extracat. 이것은 선 플롯뿐만 아니라 일반적인 접근 방식을 제공합니다. 다음은 산점도를 사용한 예제입니다 ( 이 페이지 의 맨 아래부터 ).

data(olives, package="extracat")
library(scales)
fs1 <- facetshade(data = olives,
                  aes(x = palmitic, y = palmitoleic), f = .~Area)
fs1 + geom_point(colour = alpha("black", 0.05)) +
      geom_point(data = olives, colour = "red") +
      facet_wrap(f=~Area, nrow=3) + theme(legend.position="none")

여기에 이미지 설명을 입력하십시오


편집 : 그의 초기 답변에서 Adrian의 시뮬레이션 데이터 세트 사용 :

library(extracat)
facetshade(df, aes(x=time, y=y), f = .~label, bg.all = FALSE, keep.orig = TRUE) +
           geom_line(aes(x=time, y=y, group=orig.label),colour = alpha(1,0.3)) +
           geom_line(data=df, aes(colour=label), size = 1.2) + xlab("") + ylab("")

다른 방법은 배경과 강조된 경우에 각각 하나씩 두 개의 별도 레이어를 그리는 것입니다. 트릭은 패싯 변수없이 데이터 세트를 사용하여 배경 레이어를 그리는 것입니다. 올리브 오일 데이터 세트의 코드는 다음과 같습니다.

data(olives, package="extracat")
ggplot(olives, aes(palmitic, palmitoleic)) + 
  facet_wrap(~Area, nrow=3) + 
  geom_point(data=olives %>% select(-Area), colour=alpha("black", 0.05)) + 
  geom_point(data=olives, colour="red") + 
  theme(legend.position="none")

1
이것은 좋은 일반적인 접근법 (+1)처럼 보이지만 특정 예는 다른 문제와 관련이 있습니다. 다르게 강조 표시된 영역이있는 반복 된 산점도는 시계열에 관한 문제에는 효과가 없습니다.
Sextus Empiricus

@martin 실제로 그것은 또한 Adrian의 해결책이기도합니다. 그는 두 개의 동일한 레이블 변수를 사용하므로 하나는 배경 레이어에 놓일 수 있습니다. 아래의 깔끔한 표기법을 사용하면 코딩 아이디어가 더욱 분명해지며, 종종 그래픽의 우아한 형식이 코드의 중요한 부분을 가릴 수 있습니다. ggplot(df %>% select(-label), aes(x=time, y=y, group=label2)) + geom_line(alpha=0.8, color="grey") + labs(y=NULL) + geom_line(data=df, color="red") + facet_wrap(~ label)
Antony Unwin

5

다음은 Ch에서 영감을 얻은 솔루션입니다. 11.3, ggplot2에 대한 Hadley Wickham 's Book의 "Texas Housing Data"섹션 . 여기에서는 각 시계열에 선형 모델을 맞추고 잔차 (평균 0을 중심으로)를 취하고 다른 색상으로 요약 선을 그립니다.

library(ggplot2)
library(dplyr)
#works with dplyr version 0.4.3.9000 from Github (hadley/dplyr@4f2d7f8), or higher

df1 <- as.data.frame(list(Var = structure(c(1L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 
                                 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 
                                 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 11L, 11L, 11L, 11L, 11L, 
                                 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 13L, 14L, 14L, 14L, 14L, 
                                 14L, 14L, 14L, 16L, 16L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 
                                 17L, 17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L), .Label = c("A", 
                                                                                               "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", 
                                                                                               "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"), class = "factor"), 
               Year = c(2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
                        2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
                        1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 
                        2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 
                        2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 
                        1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 
                        2000L, 2004L, 2011L, 2015L, 1993L, 1996L, 2000L, 2004L, 2011L, 
                        2015L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 2011L, 2015L, 
                        1991L, 1993L, 1996L, 2000L, 2011L, 2015L, 1991L, 1993L, 1996L, 
                        2000L, 2004L, 2011L, 2015L, 1991L, 1993L, 1996L, 2000L, 2004L, 
                        2011L, 2015L), 
               Val = c(25.6, 22.93, 20.82, 24.1, 24.5, 29, 
                       25.55, 24.5, 24.52, 20.73, 25.8, 25.5, 29.5, 27.7, 25.1, 
                       25, 24.55, 26.75, 25, 30.5, 27.25, 25.1, 22.4, 27.07, 26, 
                       29, 27.2, 24.2, 23, 24.27, 27.68, 27, 30.5, 28.1, 24.9, 23.75, 
                       22.75, 27.25, 25, 29, 28.45, 24, 20.25, 17.07, 24.45, 25, 
                       28.5, 26.75, 24.9, 21.25, 20.65, 25.1, 24.5, 26.5, 25.35, 
                       23.5, 21.93, 26.5, 24.5, 29, 29.1, 26.4, 28.1, 23.75, 26.5, 
                       28.05, 27, 30.5, 25.65, 23.3, 23.25, 24.57, 26.07, 27.5, 
                       28.85, 27.7, 22, 23.43, 26.88, 27, 30.5, 29.25, 28.1, 23, 
                       23.8, 28.32, 27, 29.5, 29.15, 27.6)), 
               row.names = c(1L, 4L, 
                           5L, 6L, 7L, 8L, 9L, 10L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 
                           21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 32L, 35L, 
                           36L, 37L, 38L, 39L, 40L, 41L, 44L, 45L, 46L, 47L, 48L, 49L, 50L, 
                           53L, 54L, 55L, 56L, 57L, 58L, 59L, 62L, 63L, 64L, 65L, 66L, 67L, 
                           68L, 69L, 70L, 71L, 72L, 73L, 74L, 75L, 78L, 79L, 80L, 81L, 82L, 
                           83L, 84L, 87L, 88L, 89L, 90L, 91L, 92L, 95L, 96L, 97L, 98L, 99L, 
                           100L, 101L, 104L, 105L, 106L, 107L, 108L, 109L, 110L), 
               na.action = structure(c(2L, 
                          3L, 11L, 12L, 33L, 34L, 42L, 43L, 51L, 52L, 60L, 61L, 76L, 77L, 
                          85L, 86L, 93L, 94L, 102L, 103L), 
                .Names = c("2", "3", "11", "12","33", "34", "42", "43", "51", "52", "60", 
                           "61", "76", "77", "85", "86", "93", "94", "102", "103"), class = "omit"), 
                class = "data.frame", .Names = c("Var","Year", "Val"))


df1 %>%
        group_by(Var) %>%
        do(mutate(.,resid = resid(lm(Val ~ Year, data=., na.action = na.exclude)))) %>%
        ggplot(aes(Year, resid)) +
        labs(y=paste0("Val "), x="Year") +
        geom_line(aes(group = Var), alpha = 1/5) +
        geom_line(stat = "summary", fun.y = "mean", colour = "red")

여기에 이미지 설명을 입력하십시오


1
여기서 주요 아이디어는 눈과 마음을 돕기 위해 일종의 요약 곡선을 추가 할 수있는 것 같습니다. 동의하지만 대답에서 원래 단위와 값을 남기지 않고 평균 (또는 참조 레벨) 0으로 이동하는 것에 대한 절충을 철회 할 수 있습니다. 주제 전문가 및 / 또는 고객은 24 또는 28 또는 어떤 값이든 생각할 수 있습니다. 당연히 여기의 데이터는 토론의 수단 일 뿐이지 만 요점은 매우 일반적입니다.
Nick Cox
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.