그래프에 세 가지 정보 표시


15

참고 : 이제 50 포인트의 원시 데이터가 첨부되었습니다.

일주일에 몇 주 동안 공부를했는지, 그리고 일주일 내내 얼마나 많은 페이지를 완료했는지를 보여 드리고자합니다.여기에 이미지 설명을 입력하십시오

사람들에게 그래프를 이해할 수 없다고 말하게했지만 그래프를 표시 할 수있는 방법을 모릅니다. 누적 묘사없이 본질적으로 3 차원이 필요하기 때문에. 몇 주 후에 그래프를 읽을 수 없게되므로 수많은 선 그래프 사용을 피하고 싶습니다. 내가 할 수있는 일이 없습니까?

더 명확하게 표시하려면 어떻게해야합니까?

Date        Total   Total pages
21/11/2014  2.4166   0
22/11/2014  0        0
23/11/2014  1.5833   4
24/11/2014  3.0166  13
25/11/2014  2.4999   6
26/11/2014  1.4833   3
27/11/2014  3.0499   6
28/11/2014  0        0
29/11/2014  2.4499   5
30/11/2014  2.8833   2
 1/12/2014  0        0
 2/12/2014  4.1166   8
 3/12/2014  1.3333   5
 4/12/2014  1.2499   3
 5/12/2014  1.6666   8
 6/12/2014  0        0
 7/12/2014  2.4833   9
29/12/2014  0        0
30/12/2014  1.2332   1
31/12/2014  0.3333   0
 1/01/2015  3.5666   2
 2/01/2015  0.8166   0
 3/01/2015  2.75    28
 4/01/2015  0.4166   0
 5/01/2015  1.2833   0
 6/01/2015  0.3333   3
 7/01/2015  0        0
 8/01/2015  0        0
 9/01/2015  2.35     2
10/01/2015  0.5666   0
11/01/2015  0        0
12/01/2015  1.6666   0
13/01/2015  2.2666   5
14/01/2015  2.5165   6
15/01/2015  2.0166   0
16/01/2015  2.9666   1
17/01/2015  0.8333   0
18/01/2015  0.6666   1
19/01/2015  1.45     0
20/01/2015  0.3166   0
21/01/2015  0        0
22/01/2015  0.2333   0
23/01/2015  0.85     2
24/01/2015  0        0
25/01/2015  0        0
26/01/2015  0.6666   4
27/01/2015  0.8333   1
28/01/2015  1.5498   5
29/01/2015  6.4159   9
30/01/2015  2.9166   0

샘플 데이터를 게시 할 수 있으면 관심있는 사람들이 솔루션을 재생하고 보여줄 수 있습니다. 현실적으로, 문제의 본질이 주 수가 증가함에 따라 일어나는 일이기 때문에 몇 주가 필요할 것입니다.
Nick Cox

내가 데이터를 변경하는 방법을 정직하게 확실하지 오전 난 단지 지금까지의 첫 번째 십삼일을 통해 살았 이후 @NickCox 나는 몇 주에 다시 게시 할 수 있습니다 (3없는 연구와 그 중)

@NickCox 원시 데이터는 어떻게 게시합니까?

1
내 충고는 조금 기다려. 질문을 업데이트함으로써 당신은 그것에 관심을 끌었습니다. 새로운 답변이 있는지 확인하십시오.
Nick Cox

1
이 데이터 에 대해 무엇을 표시 하시겠습니까? 어떤 이야기를 하시겠습니까? 막대 그래프를 사용하여 사람들이 데이터에 대해 이해하도록하려는 것은 무엇입니까?
gung-Monica Monica 복원

답변:


7

날짜 / 달력 기반 데이터를 시각화하는 한 가지 방법은 데이터를 색상으로 인코딩하는 매트릭스 디스플레이를 사용하는 것입니다. 행은 주를 나타내고 열은 일을 나타내도록 행렬 (또는 테이블)이 정렬됩니다. 원하는 경우 주간 합계에 대한 최종 열을 추가 할 수 있습니다.

데이터가 올바르게 정렬되면 조건부 서식을 사용하여 Excel에서 다소 간단하게 구현할 수 있습니다. 특히 원본 데이터를 조회하는 수식을 사용하여 값의 "그리드"를 만들 수 있습니다. 여기에서 조건부 서식을 사용하여 결과를 표시 할 수 있습니다.

결과는 다음과 같습니다. 날짜 형식을 변경하여 죄송합니다. 셀 H1의 공식은 다음과 같습니다 "=IFERROR(VLOOKUP($G$1+$G6*7+H$5, $B$5:$C$16,2,FALSE), 0)". 올바른 순서로 요일을 얻기 위해 수학을하고 있습니다. 잘만되면 그것은 간단하다.

행렬 배열을 사용한 조건부 서식 이미지

실제로 봉투를 밀고 자하는 경우 d3 및 해당 일정 플러그인 같은 프레임 워크를 사용 하여이 데이터를 표시 할 수 있습니다. 그것은 가치있는 것보다 더 많은 사업 일 수 있습니다.

이 형식은 GitHub가 시간에 따른 사용자 활동 / 기여를 표시하는 방법과 매우 유사합니다. 여기에 한 명의 사용자가 있습니다 (나 아님). 여기에 이미지 설명을 입력하십시오


2
(+1) 특히이 방법은 데이터를 입력하는 것과 동일한 스프레드 시트에서 사용하기에 적합하기 때문에이 방법이 마음에 듭니다. 이 그래픽 디스플레이는 사실상 열지도 입니다. 나는 정기적으로 비슷한 설정을 직접 사용하며, 한 가지 약점은 추세의 측면을 선택하기가 어렵다는 것입니다. 그리고 나는 모두 좋은 제안을했습니다.)
Silverfish

6

원본의 두드러진 특징은 주간 합계입니다. 개별 값은 색상을 배운 후에 만 ​​의미가 있으며, 이것이 새로운 시청자에게 줄거리가 작동하지 않는 큰 이유라고 생각합니다. 이와 관련하여 일의 시간 측면이 손실됩니다. 연속 색상의 세트는 할 수있다 (예를 들어, 7 음영 파란색의) 도움이됩니다.

일반적으로 모든 항목에 레이블을 붙이지 않아도됩니다. 정확한 값이 중요합니까? 레이블이 붙은 모든 값이 없으면 그래프를 해석 할 수 없으면 그래프가 작동하지 않습니다.

내 시도에 . 주간 합계의 명백한 중요성을 감안할 때 주간 누적 합계를 플로팅했습니다. 주간 합계와 요일을 시간 순서대로 표시합니다. 정확한 일 값은 명확하지 않지만 특이 값은 여전히 ​​두드러집니다.

이러한 종류의 작은 선 그림 ( 스파크 라인 크기 로 축소 될 수 있음 )의 경우 참조 선 또는 영역을 갖는 것이 좋습니다. 설명을 위해 대상 범위를 추가했습니다. 목표가 적절하지 않은 경우 참조는 지난 3 주 동안의 범위 또는 고정 참조 값과 같은 것일 수 있습니다.

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

나는 빠른 스캔을 위해 목표보다 몇 주 아래에 있었는지 나타 내기 위해 빨간색을 사용했습니다.

몇 주가 더 걸리면 수직 목록이 아닌 그리드로 구성 할 수 있습니다.

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


나는 이것이 우수하다고 생각합니다. 학습 시간과 페이지에서 다루는 정보를 결합하는 효과적인 방법이 있습니까? 첫 번째 그래픽에서 "연구 시간"과 "페이지 완료"를 연속으로하는 것이 상당히 효과적이라고 생각합니다. ). 그러나 두 번째 그래픽에서 무엇이 잘 작동하는지 잘 모르겠습니다.
Silverfish

분명히 하나의 해결책은 연구 된 페이지의 두 번째 세로 축으로 두 시리즈를 오버 플로팅하는 것이지만 많은 사람들이 이에 대해 강한 의견을 가지고 있습니다. 예를 들어 Hadley Wickham은 의도적으로 ggplot에서 구현을 거부합니다. 나는 일반적으로 이것을 피할 것이지만, 둘 다에 대한 목표가 있다면 합리적 일 수 있습니다-이것은 시간과 페이지의 목표 영역이 깔끔하게 정렬되도록 2 차 y 축에 자연스러운 스케일을 도입합니다. 이러한 스케일링 결정은 일반적으로 다수의 y 축에서 논란이되는 문제입니다.
Silverfish

감사합니다 @ Silverfish! 또한 하나의 그래프에서 두 개의 스케일을 피할 수는 있지만 둘 다 각각의 목표에 대해 동일한 스케일로 배치 할 수 있다면 효과가있을 수 있습니다. 나는 하나의 측정 값 만 표시함으로써 다른 측정 값은 동일한 방식으로 별도의 그래프로 표시 될 것이라고 가정했습니다. 수직 목록 양식에서 각 측정 값은 별도의 그래프 열일 수 있습니다.
xan

이것은 또 다른 위대한 대답입니다. 나는 당신이 적용한 목표 아이디어를 좋아합니다. 모든 답을 보았으므로 지금 무엇을해야하는지 알아야합니다. 감사합니다

5

올바르게 이해하면 선 그래프를 사용하지 않으려는 이유는 너무 많은 주가 있고 그래프가 지저분 해지기 때문입니다.

이것이 문제라면 시계열을 구성 요소로 나눌 수 있습니다.

일일 변형

주간 변형

장기 트렌드

다른 것.

William S. Cleveland는 그의 책 중 하나에서 좋은 예를 보여줍니다 (저는 사무실에 있지 않으며 그의 책 중 어느 것이 그 예가 있는지 기억이 나지 않지만 데이터 시각화 또는 데이터 그래프의 요소 중 하나입니다 ).

R과 SAS에는이를위한 도구가 있습니다. 둘 중 하나에 액세스 할 수 있습니까?


컴퓨터에 R이 있지만 거의 사용하지 않습니다. (완전히 배우려고하지만)

학습 곡선이 있지만 decompose () 함수를 살펴보십시오. 원하는 것을 얻기 위해 약간의 연주를해야 할 수도 있습니다. 또한 클리블랜드의 책을 찾을 수 있다면 그 책은 훌륭합니다.
Peter Flom-Monica Monica 복원

3
다음은 R 문서에서 Peter가 언급 한 Cleveland 예제입니다. 만약 당신이 R을 설치했다면 stat.ethz.ch/R-manual/R-devel/library/stats/html/stl.html
Kieran

@ 키란 올바른 출력? imgur.com/IzRC0h8

5

먼저 원래 누적 또는 분할 막대 그래프에 대한 이의 제기를 철회하겠습니다.

ㅏ. 색상 코딩은 완전히 임의적으로 나타납니다. 따라서 범례와 그래프간에 반복적으로 앞뒤로 이동하지 않으면 그래프를 연구 할 수 없습니다.

비. 보이지 않는 막대 세그먼트로 0은 암시 적입니다. 0은 변형의 일부입니다.

이러한 이유로 인해 그래프를 해독하기가 어렵습니다.

즉, 관심이 주 단위로 총 변동을 연구하는 데 관심이 있다면 그래프에 장점이 있습니다. 많은 주가 많은 막대로 그려 질 수 있습니다. 이에 따른 단점은 몇 주 내에 변형을 연구하기가 점점 더 어려워진다는 것입니다.

백업 : 각 문제마다 세 가지 변수가 있습니다.

  1. 공부 한 시간 또는 페이지 완성

  2. 요일.

  3. 주 번호.

주 수가 증가하면 그래프가 더 자세 해집니다. 문제는 세부 사항을 통제하는 것입니다.

순환 도표를 고려할 것입니다 (다른 이름은 문헌에서 사용되었지만 대부분 계절 변화를 보는 데 사용됩니다). 나오미 로빈스 (Naomi Robbins) 의 소개가 여기 있습니다 .


아주 좋은 링크 주셔서 감사합니다. 귀하의 이의 제기에 대한 한 가지 의견, 일은 실제로 금요일에서 목요일까지 쌓이지 만, 며칠이 빠지는 것은 가독성과 관련하여 분명히 유효한 우려입니다.

실제로, 사람들은 여전히 ​​전설을 사용하여 디코딩해야합니다.
Nick Cox

R은이 monthplot의 참조 - 실제로 매주 데이터를 사용할 수있는 명령 stackoverflow.com/questions/5826703/...
좀 벌레

5

7 일, 14 일 또는 28 일 이동 평균을 구한 경우 선 그래프를 이해하기가 더 쉬울 것입니다. 그것은 그들을 매끄럽게하고 여전히 추세를 파악할 수있게합니다.

이것은 Peter Flom의 솔루션과 약간 유사하지만 다소 간단하므로 전체 그림으로 알 수는 없지만 귀하의 요구에 충분할 수 있습니다. 스프레드 시트에 데이터를 기록하는 경우 일부 수식을 설정하여 스프레드 시트 자체 내에서 이러한 평균화를 쉽게 수행 할 수 있다는 장점이 있으며 새 데이터를 채울 때 그래프가 자동으로 업데이트됩니다.

그래프를 포함하도록 업데이트

이동 평균에 대한 선 그래프

7 일 순환 평균에 대한 스프레드 시트 그래프는 눈에 띄지 않지만 잘 작동하는 것 같습니다. 일별 변동이 완화되어 추세를 더 쉽게 감지 할 수 있습니다 (이해할 수없는 시끄러운 일일 차트와 비교). 예를 들어, 1 월 중순에 시간 단위로 많은 양의 작업이 수행되었지만 하루에 완료된 평균 페이지 수가 비례 적으로 증가하지는 않았습니다. 성탄절은 매우 눈에 잘 띄고 개별 데이터 포인트가 명확하게 표시되어있는 한 너무 오도되지 않습니다 (선만 보이는 경우 데이터가 부족하여 플랫 기간이 결정되었다는 것을 판단 할 수 없습니다!). 그럼에도 불구하고, 나는 강력히 추천합니다 포함1.5

50 개의 데이터 항목 만 있으면 장기 실행 추세를 감지하기 위해 오랜 기간 동안 평균을 계산할 가치가 없었습니다. 마찬가지로 Peter Flom의 계절 분해에 대한 훌륭한 아이디어는 그러한 제한된 데이터로 인해 어려움을 겪을 것으로 의심됩니다. 스프레드 시트에서 분해를 수행하려면 나누기를 0 데이터로 포함하는 것이 훨씬 더 중요합니다.

내 수식을 재현하려면 '날짜'가 셀에 있도록 붙여 넣으십시오 A1.

Date    Hours   Pages   7-day rolling hours 7-day rolling pages
25/11/14    2.4999  6       
26/11/14    1.4833  3       
27/11/14    3.0499  6       
28/11/14    0   0       
29/11/14    2.4499  5       
30/11/14    2.8833  2       
01/12/14    0   0   =AVERAGE(B2:B8) =AVERAGE(C2:C8)
02/12/14    4.1166  8   =AVERAGE(B3:B9) =AVERAGE(C3:C9)
03/12/14    1.3333  5   =AVERAGE(B4:B10)    =AVERAGE(C4:C10)
04/12/14    1.2499  3   =AVERAGE(B5:B11)    =AVERAGE(C5:C11)
05/12/14    1.6666  8   =AVERAGE(B6:B12)    =AVERAGE(C6:C12)
06/12/14    0   0   =AVERAGE(B7:B13)    =AVERAGE(C7:C13)
07/12/14    2.4833  9   =AVERAGE(B8:B14)    =AVERAGE(C8:C14)
29/12/14    0   0   =AVERAGE(B9:B15)    =AVERAGE(C9:C15)
30/12/14    1.2332  1   =AVERAGE(B10:B16)   =AVERAGE(C10:C16)
31/12/14    0.3333  0   =AVERAGE(B11:B17)   =AVERAGE(C11:C17)
01/01/15    3.5666  2   =AVERAGE(B12:B18)   =AVERAGE(C12:C18)
02/01/15    0.8166  0   =AVERAGE(B13:B19)   =AVERAGE(C13:C19)
03/01/15    2.75    28  =AVERAGE(B14:B20)   =AVERAGE(C14:C20)
04/01/15    0.4166  0   =AVERAGE(B15:B21)   =AVERAGE(C15:C21)
05/01/15    1.2833  0   =AVERAGE(B16:B22)   =AVERAGE(C16:C22)
06/01/15    0.3333  3   =AVERAGE(B17:B23)   =AVERAGE(C17:C23)
07/01/15    0   0   =AVERAGE(B18:B24)   =AVERAGE(C18:C24)
08/01/15    0   0   =AVERAGE(B19:B25)   =AVERAGE(C19:C25)
09/01/15    2.35    2   =AVERAGE(B20:B26)   =AVERAGE(C20:C26)
10/01/15    0.5666  0   =AVERAGE(B21:B27)   =AVERAGE(C21:C27)
11/01/15    0   0   =AVERAGE(B22:B28)   =AVERAGE(C22:C28)
12/01/15    1.6666  0   =AVERAGE(B23:B29)   =AVERAGE(C23:C29)
13/01/15    2.2666  5   =AVERAGE(B24:B30)   =AVERAGE(C24:C30)
14/01/15    2.5165  6   =AVERAGE(B25:B31)   =AVERAGE(C25:C31)
15/01/15    2.0166  0   =AVERAGE(B26:B32)   =AVERAGE(C26:C32)
16/01/15    2.9666  1   =AVERAGE(B27:B33)   =AVERAGE(C27:C33)
17/01/15    0.8333  0   =AVERAGE(B28:B34)   =AVERAGE(C28:C34)
18/01/15    0.6666  1   =AVERAGE(B29:B35)   =AVERAGE(C29:C35)
19/01/15    1.45    0   =AVERAGE(B30:B36)   =AVERAGE(C30:C36)
20/01/15    0.3166  0   =AVERAGE(B31:B37)   =AVERAGE(C31:C37)
21/01/15    0   0   =AVERAGE(B32:B38)   =AVERAGE(C32:C38)
22/01/15    0.2333  0   =AVERAGE(B33:B39)   =AVERAGE(C33:C39)
23/01/15    0.85    2   =AVERAGE(B34:B40)   =AVERAGE(C34:C40)
24/01/15    0   0   =AVERAGE(B35:B41)   =AVERAGE(C35:C41)
25/01/15    0   0   =AVERAGE(B36:B42)   =AVERAGE(C36:C42)
26/01/15    0.6666  4   =AVERAGE(B37:B43)   =AVERAGE(C37:C43)
27/01/15    0.8333  1   =AVERAGE(B38:B44)   =AVERAGE(C38:C44)
28/01/15    1.5498  5   =AVERAGE(B39:B45)   =AVERAGE(C39:C45)
29/01/15    6.4159  9   =AVERAGE(B40:B46)   =AVERAGE(C40:C46)
30/01/15    2.9166  0   =AVERAGE(B41:B47)   =AVERAGE(C41:C47)

5

귀하의 질문을 이해하면 시간과 페이지를 별도로 표시하는 것이 가능합니다. 내가 먼저 할게 그런 다음 한 줄에 총계와 페이지를 표시합니다. 실제 숫자가 가장 중요한 것은 아니라고 추측합니다. 생산적이고 그렇지 않은 주와 주중에 대한 개요를 얻는 것이 더 중요합니다. 이 경우 데이터에 실제로 하나의 시간 차원 만 있기 때문에 자연 시간 구조를 유지하는 것이 좋습니다. 우리는 여전히 주를 구분하는 방법을 찾을 수 있습니다.

이 첫 줄거리를 만들기 위해 다음 R 코드와 ggplot2 패키지를 사용했습니다. 귀하의 데이터는 아래 코드에서 객체 데이터로로드되었습니다. 플롯은 그룹화 된 막대 플롯이며 회색 막대는 주별 페이지 합계를 나타냅니다.

data <- rbind(data.frame(Date = c("17/11/2014", "18/11/2014", "19/11/2014", "20/11/2014"),
                         Total = rep(0, 4),
                         Pages = rep(0, 4)), 
              data,
              data.frame(Date = c("31/01/2015", "01/02/2015"),
                         Total = c(0, 0),
                         Pages = c(0, 0)))

n <- dim(data)[1]

data$Date <- as.Date(data$Date, format = "%d/%m/%Y")
data$weekday <- factor(rep(c("Monday", "Tuesday", "Wednesday", "Thursday",
                             "Friday", "Saturday", "Sunday"), length.out = n))
data$weekday <- factor(data$weekday, levels(data$weekday)[c(2,6,7,5,1,3,4)])
data$week <- factor(rep(seq(from = 0, to = ceiling(((n - 3)/7))), 
                        each = 7, length.out = n))

ggplot(data = data, aes(x = week, y = Pages)) + 
  geom_bar(aes(fill = weekday), stat = "identity", position = "dodge") + 
  labs(fill = NULL) + xlab(NULL) + ylab("Number of pages") + 
  geom_bar(stat = "identity", alpha = 0.2) + theme(panel.background = element_blank()) +
  scale_x_discrete(labels = paste("Week", seq(from = 0, to = 7)))

회색 막대의 높이는 페이지의 주 합계를 나타냅니다.

이것은 완벽하지 않습니다. 회색 막대는 일 막대와 비교할 때 같은 양의 판독을 위해 더 넓은 영역을 갖기 때문에 지배적입니다. 우리는 그것들을 더 얇게 만들 수 있었지만, 나는 그들이 주를 한정하는 방식을 좋아합니다. 그들은 같은 요일에 어떤 요일이 있는지를 아주 잘 나타냅니다. 그렇지 않으면 이해할 수없는 것입니다. 특히 카운트가 0이기 때문에.

다음 줄에서는 회색 막대의 높이로 평균 페이지 수 (주 이내)를 사용했습니다.

회색 막대의 높이는 페이지의 주 평균을 나타냅니다.

이것은 아마도 데이터를 더 잘 나타냅니다. 그러나 0 주와 7 주에는 7 일이 포함되어 있지 않기 때문에 오해의 소지가 있습니다. 이 문제를 쉽게 해결할 수 있습니다.

페이지와 시간을 동시에 표시 할 것을 요구하는 경우 연속 막대 플롯을 수행 할 수 있습니다. 두 개의 수직 스케일이 같지 않기 때문에 약간 혼란 스러울 수 있습니다. 반면에, 이렇게 소비 된 시간과 작업을 직접 비교하는 것이 좋습니다.

연속 된 플롯에서 시간과 페이지를 결합합니다.

편집 : 색상이 실제로 그렇게 많이 필요하지 않고 xan (아래 주석 참조)에서 영감을 얻음으로써 플롯을 이와 같이 단순화 할 수 있습니다. 추가 시각 가이드를 제공하기 위해 목요일에 표시했습니다. 모든 막대에 동일한 색상을 사용하여 (임의의) 며칠을 지나치게 강조하지 않도록 주장 할 수도 있습니다.

더 간단한 버전.

마지막으로 값을 평균값으로 나누어 축을 다르게 스케일링 할 수도 있습니다. 이것은 1을 "정상"값으로 만듭니다. 이 지점을 강조하기 위해 1에서 라인을 포함시킬 수 있습니다. 이제 연속 플롯에서 수행됩니다. 이는 평균 작업 부하 측면에서 "좋은"날과 "나쁜"날을 구분합니다.

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

이 그림에서 우리는 하나의 단위가 현재 비교 가능한 두 축의 동일한 거리에 해당하는지 확인할 수 있습니다.

또한 첫 번째 버전에서 요일을 엉망으로 만들었습니다. 코드와 줄거리를 수정했으며 지금은 일주일 내내 연습하겠습니다.

마지막 줄거리를 만든 코드 :

data$normPages <- data$Pages/mean(data$Pages)
data$normTotal <- data$Total/mean(data$Total)

data$weekNormPages <- data$Pages/(7*mean(data$Pages))
data$weekNormTotal <- data$Total/(7*mean(data$Total))

pTop <- ggplot(data = data, aes(x = week)) + geom_bar(aes(linetype = weekday, y = normPages), 
                                                      stat = "identity", position = "dodge", 
                                                      fill = "dodgerblue") + labs(fill = NULL) +
  xlab(NULL) + ylab("Number of pages") + geom_bar(aes(y = weekNormPages), stat = "identity", alpha = 0.3) + 
  theme(panel.background = element_blank(), axis.ticks.length=unit(0,"cm")) + guides(linetype = FALSE) +
  scale_x_discrete(labels = paste("Week", seq(from = 0, to = 7))) + ylab(NULL) + 
  annotate("text", label = "Pages read", x = "1", y = 10) +
  theme(plot.margin = unit(c(1,.5,.1,.8), "cm")) + geom_hline(yintercept = 1)
pTop

pBot <- ggplot(data = data, aes(x = week)) + geom_bar(aes(linetype = weekday, y = normTotal), 
                                                      stat = "identity", position = "dodge", fill = "dodgerblue") + 
  labs(fill = NULL) +
  xlab(NULL) + ylab("Number of hours") + geom_bar(aes(y = weekNormPages), stat = "identity", alpha = 0.3) + 
  theme(panel.background = element_blank(), axis.ticks.length=unit(0,"cm")) + guides(linetype = FALSE) + 
  scale_x_discrete(labels = NULL) + guides(fill = FALSE) + ylab(NULL) + scale_y_reverse() + 
  theme(plot.margin = unit(c(.1,.5,1,.8), "cm")) + 
  annotate("text", label = "Time spent", x = "1", y = 4) + geom_hline(yintercept = 1)
pBot

grid.arrange(pTop, pBot, heights = c(.5, .5), widths = c(0.5, 0.1))

이것은 원본을 향상시키는 정신에서 가장 많이 보입니다. 나는 그 아이디어를 좋아합니다. 나는 원래 또는 당신의 임의의 무지개 색상을 좋아하지 않습니다. 순차적 인 색상 세트를 사용해보십시오. 거꾸로 된 바도 나에게 도움이되지 않습니다.
xan

순차적 색상이 개선 될 수 있다고 생각합니다. 제안 해 주셔서 감사합니다. 반면에, 우리를 안내하기 위해 주 단위 구분 기호가 있기 때문에 색상이 그렇게 중요하지 않다고 생각합니다 (월요일의 첫날, 화요일의 두 번째 등). 우리는 또한 대답에서 암시 한 것처럼 연속적인 음모에 대해 동의합니다. 이 플롯의 개선점은 각각의 일일 평균에 따라 두 개의 수직 축을 스케일링하는 것입니다. 이렇게하면 몇 주와 페이지 읽기 / 시간을 쉽게 비교할 수 있습니다.
swmo

중요하지 않은 색상을 언급 했으므로 색상 변형을 제거하면 효과가 있습니다. 요일은 위치에 따라 이미 구별됩니다. 또는 수요일을 추가 앵커로 다른 그늘로 만들 수도 있습니다.
xan

아주 좋아요! 나는 다른 답변을 아직 거치지 않았지만 이것은 이미 크게 개선되었습니다! 대단히 감사합니다

1
의견의 아이디어를 포함하도록 답변을 편집했습니다. @ 도전을 위해 최선을 다하고 있습니다.
swmo

1

엑스와이

  1. 그룹화 변수로 2 주가있는 데이터를 선으로 표시합니다.
  2. 또는 각 요일에 1 주와 2 주에 각각 2 개의 막대가 있고 각각 하루에 페이지 / 시간 수를 나타내는 그룹화 된 막대 도표를 사용하십시오.

1. 위에서 무엇을하는지, 2.는 불행히도 의미가없는 것으로 보입니다. 답변 주셔서 감사합니다.

문제가 없습니다 ...보기에는 좋지 않지만 사용하는 소프트웨어 및 / 또는 그래픽 편집의 문제입니다.
Tim

1. 1 주 또는 2 주가 더 나아질 지 실제로 알 수 없으며 몇 주가 더 추가되면 너무 혼란 스러울 것입니다. 2. 나는 실제로 이것을 신경 쓰지 않는다. 그것은 실제로 꽤 좋다. 어쩌면 나는 원본과 이것을 하나로 정리하여 더 명확하게 만들 수 있습니다. (이제

1

아래 그림은 누적 막대 대신 줄을 사용하여 매주 누적 학습 시간 및 총 페이지 수를 보여줍니다. 이는 매주 추세를보다 쉽게보고 주 단위를 비교할 수 있기를 바랍니다. 누락 된 주를 0으로 채웠지만 원하는 경우 제외 할 수 있습니다. R데이터 처리 플롯 생성하기위한 코드는 그래프 아래에 배치된다.

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

아래 단계를 수행하면서 먼저 질문에 게시 된 데이터를이라는 데이터 프레임에로드했습니다 dat.

library(lubridate)
library(dplyr)
library(reshape2)
library(ggplot2)
library(scales)

# Ordered vector of weekdays
weekdayVec = c("Sunday","Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")

# Change column name
names(dat)[2] = "Hours of Study"

# Convert Date to date format
dat$Date = as.Date(dmy(dat$Date))

# Add a weekday variable and order from Sunday to Saturday
dat$Day = weekdays(dat$Date)
dat$Day = factor(dat$Day, levels=weekdayVec)

# Number the weeks from 1 to 11 and convert to a factor
dat$Week = paste("Week", (as.numeric(dat$Date) - as.numeric(dat$Date[3])) %/% 7 + 2)
dat$Week = factor(dat$Week, levels=paste("Week", c(1:11))) 

## Fill in empty dates (so we can show zero pages/hours during weeks 5 and 6 if we want)
dataFill = expand.grid(Week = paste("Week",1:11), Day=weekdayVec)
dat = merge(dataFill, dat, by=c("Week","Day"), all=TRUE)

# Fill in missing dates
dat$Date = as.Date(c(rep(NA,5), seq(as.Date("2014-11-21"),as.Date("2015-01-30"),1), NA))

# Convert missing data to zeros for Hours of Study and Total Pages
dat = dat %>% mutate(`Hours of Study` = ifelse(is.na(`Hours of Study`), 0, `Hours of Study`),
               `Total Pages` = ifelse(is.na(`Total Pages`), 0, `Total Pages`)) 

# Melt data into long format (for facetting in ggplot2)
dat.m = dat %>% melt(id.var=1:3) %>%
  group_by(Week, variable) %>%
  mutate(cumValue = cumsum(value))

# Plot Hours and Pages by date, with separate cumulative 
# curves for each week
ggplot(dat.m %>% group_by(Week, variable) %>% arrange(Week, Day), 
       aes(Date, cumValue, colour=Week, group=Week)) +
  geom_vline(xintercept=as.numeric(seq(as.Date("2014-11-16"), as.Date("2015-02-06"), 7)-0.5), colour="grey70") +
  geom_line(position=position_dodge(width=0.5)) +
  geom_point(size=2.5, position=position_dodge(width=0.5)) +
  facet_grid(variable ~ ., scales="free_y") +
  guides(colour=guide_legend(reverse=TRUE)) + labs(y="",x="") +
  guides(colour=FALSE) +
  scale_x_date(limits=c(as.Date("2014-11-16"),as.Date("2015-01-31")),
               breaks=seq(as.Date("2014-11-16"),as.Date("2015-01-31"), 7)-0.5,
               labels=paste("                  Week",1:11)) +
  theme_grey(base_size=15)

이것은 정말 좋은 생각이며 어느 날을보고 있는지 결정하기 어려운 문제를 확실히 해결합니다. 감사합니다

0

다른 옵션은 거품 형 차트로, 한 변수의 세로 높이와 다른 변수의 도트 크기를 지정할 수 있습니다. 아래에서 날짜 (일)는 가로이고, 공부 한 시간은 세로이며, 하루에 적용되는 페이지는 거품 크기이며주는 색칠되어 있습니다.

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


0

3D로 플롯 할 수 있습니다. 요일이 올바르게 계산되었는지 확인하지 못하고 최상의 시야각을 찾는 등의 아이디어를 제공해야합니다. 추가 장식도 가능합니다. 예를 들어, 점을 선으로 연결하고 각 월요일에 해당하도록 눈금 선을 이동하는 것이 좋습니다.

실제로 시도하는 것이 매우 흥미로운 것은 각 왼쪽 및 오른쪽 그리드 선 (이 각도로 표시됨)이 같은 요일 (예 : 월요일)에 해당하는 경우 상자 그림을 오른쪽 아래 벽과 오른쪽 벽에 배치하는 것입니다 격자 선. 박스 플롯은 각각 주당 총 시간과 총 페이지 수에 해당합니다. 나는 rgl과 관련이있을 것이라고 확신하지만 약간의 어설프게 필요합니다. 그만한 가치가 있습니다. 바이올린 음모 또는 beanplots가 더 나을 수 있습니다.

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

데이터 (R에 입력) :

dat<-structure(list(Date = structure(c(17L, 19L, 21L, 23L, 25L, 27L, 
29L, 31L, 33L, 38L, 2L, 14L, 36L, 42L, 44L, 46L, 48L, 34L, 39L, 
40L, 1L, 13L, 35L, 41L, 43L, 45L, 47L, 49L, 50L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 11L, 12L, 15L, 16L, 18L, 20L, 22L, 24L, 
26L, 28L, 30L, 32L, 37L), .Label = c("1/1/2015", "1/12/2014", 
"10/1/2015", "11/1/2015", "12/1/2015", "13/01/2015", "14/01/2015", 
"15/01/2015", "16/01/2015", "17/01/2015", "18/01/2015", "19/01/2015", 
"2/1/2015", "2/12/2014", "20/01/2015", "21/01/2015", "21/11/2014", 
"22/01/2015", "22/11/2014", "23/01/2015", "23/11/2014", "24/01/2015", 
"24/11/2014", "25/01/2015", "25/11/2014", "26/01/2015", "26/11/2014", 
"27/01/2015", "27/11/2014", "28/01/2015", "28/11/2014", "29/01/2015", 
"29/11/2014", "29/12/2014", "3/1/2015", "3/12/2014", "30/01/2015", 
"30/11/2014", "30/12/2014", "31/12/2014", "4/1/2015", "4/12/2014", 
"5/1/2015", "5/12/2014", "6/1/2015", "6/12/2014", "7/1/2015", 
"7/12/2014", "8/1/2015", "9/1/2015"), class = "factor"), TotalHours = c(2.4166, 
0, 1.5833, 3.0166, 2.4999, 1.4833, 3.0499, 0, 2.4499, 2.8833, 
0, 4.1166, 1.3333, 1.2499, 1.6666, 0, 2.4833, 0, 1.2332, 0.3333, 
3.5666, 0.8166, 2.75, 0.4166, 1.2833, 0.3333, 0, 0, 2.35, 0.5666, 
0, 1.6666, 2.2666, 2.5165, 2.0166, 2.9666, 0.8333, 0.6666, 1.45, 
0.3166, 0, 0.2333, 0.85, 0, 0, 0.6666, 0.8333, 1.5498, 6.4159, 
2.9166), TotalPages = c(0L, 0L, 4L, 13L, 6L, 3L, 6L, 0L, 5L, 
2L, 0L, 8L, 5L, 3L, 8L, 0L, 9L, 0L, 1L, 0L, 2L, 0L, 28L, 0L, 
0L, 3L, 0L, 0L, 2L, 0L, 0L, 0L, 5L, 6L, 0L, 1L, 0L, 1L, 0L, 0L, 
0L, 0L, 2L, 0L, 0L, 4L, 1L, 5L, 9L, 0L)), .Names = c("Date", 
"TotalHours", "TotalPages"), class = "data.frame", row.names = c(NA, 
-50L))

줄거리 만들기 :

#Get Day of Week
dat<-cbind(weekdays(as.Date(dat[,1], format="%d/%m/%Y")),dat)
colnames(dat)[1]<-"DoW"

#3D Plot
require(rgl)
plot3d(dat[,2],dat[,3],dat[,4],size=15, 
xlab=colnames(dat)[2], ylab=colnames(dat)[3],
zlab=colnames(dat)[4],col=rainbow(7)[as.numeric(dat[,1])])
text3d(x=10, y=6, z=seq(25,15,length=7),levels(dat[,1]),
col=rainbow(7), font=2)
grid3d(side=c("x", "y+", "z"), lwd=1)

-1

주 번호 (연도), 요일 및 시간 및 페이지의 패싯이있는 히트 맵을 따르면 도움이 될 수 있습니다.

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

2 개의 높은 값을 제거하면 플롯에서 더 나은 색상 그라디언트가 나타납니다.

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

다음 막대 차트도 도움이 될 수 있습니다.

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

아무런 작업을하지 않은 2 주 기간이 명확하게 표시됩니다.

선이있는 플롯도 유용 할 수 있습니다 (선이 어수선하지 않음; 두 개의 선만 유지하면서 점을 제거 할 수도 있음)

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

이해하기 쉽도록 줄거리를 단순화하면서 정보를 명확하게 전달합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.