R 플롯 : 균일하지 않은 숫자에 대한 틱 사이의 균일 한 거리

마이클 S 테일러

R에서이 Paleo temperature 수치의 기본 온도 추세를 재현하려고합니다. ( 원본 이미지데이터 .)

여기에 이미지 설명 입력

x 축의 눈금 간격은 1 억년에서 1 천만년에서 1 천만년, 그리고 10 만년 등으로 변경되지만 눈금 표시 간격은 균등합니다. 원본 그림은 간격을 맞추기 위해 Excel에서 5 개의 개별 그래프로 신중하게 배치되었습니다. R에서 동일한 x 축 레이아웃을 얻으려고합니다.

두 가지 기본 접근 방식을 시도했습니다. 첫 번째 방법은 par(fig=c(x1,x2,y1,y2))5 개의 개별 그래프를 나란히 배치하는 데 사용 하는 것입니다. 문제는 눈금 사이의 간격이 균일하지 않고 레이블이 겹친다는 것입니다.

#1
par(fig=c(0,0.2,0,0.5), mar=c(3,4,0,0))
plot(paleo1$T ~ paleo1$Years, col='red3', xlim=c(540,60), bty='l',type='l', ylim=c(-6,15), ylab='Temperature Anomaly (°C)')
abline(0,0,col='gray')

#2
par(fig=c(0.185,0.4,0,0.5), mar=c(3,0,0,0), new=TRUE)
plot(paleo2$T ~ paleo2$Year, col='forestgreen', axes=F, type='l', xlim=c(60,5), ylab='', ylim=c(-6,15))
axis(1, xlim=c(60,5))
abline(0,0,col='gray')

#etc.

여기에 이미지 설명 입력

두 번째 방법 (가능한 경우 선호하는 방법)은 데이터를 단일 그래프로 그리는 것입니다. 이로 인해 눈금이 "자연스러운"순서를 따르기 때문에 눈금 사이의 거리가 균일하지 않게됩니다. ( 편집 : 예제 데이터가 추가되고 전체 데이터 세트에 연결됩니다.)

years <- c(500,400,300,200,100,60,50,40,30,20,10,5,4,3,2,1)
temps <- c(13.66, 8.6, -2.16, 3.94, 8.44, 5.28, 12.98, 8.6, 5, 5.34, 3.66, 2.65, 0.78, 0.25, -1.51, -1.77)
test <- data.frame(years, temps)
names(test) <- c('Year','T')

# The full csv file can be used with this line instead of the above.
# test <- read.csv('https://www.dropbox.com/s/u0dfmlvzk0ztpkv/paleo_test.csv?dl=1')

plot(test$T ~ test$Year, type='l', xaxt='n', xlim=c(520,1), bty='l', ylim=c(-5,15), xlab="", ylab='Temperature Anomaly (°C)')
ticklabels = c(500,400,300,200,100,60,50,40,30,20,10,5,4,3,2,1)
axis(1, at=ticklabels)

여기에 이미지 설명 입력

추가 log='x'로하기 plot에 가장 가까운하지만 틱 사이의 간격은 여전히조차하고 실제 규모는 물론, 아닌 로그 스케일이다.

여기에 이미지 설명 입력

My examples only go down to 1 million years because I am trying to solve the problem first but my the goal is to match the original figure above. I am open to ggplot solutions although I am only fleetingly familiar with it.

Mark Peterson

I will strike a different note by saying: don't. In my experience, the harder something is to do in ggplot2 (and to a lesser extent, base graphics), the less likely it is to be a good idea. Here, the problem is that consistently changing the scales like is more likely to lead the viewer astray.

Instead, I recommend using a log scale and manually setting your cutoffs.

First, here is some longer data, just to cover the full likely scale of your question:

longerTest <-
  data.frame(
    Year = rep(1:9, times = 6) * rep(10^(3:8), each = 9)
    , T = rnorm(6*9))

Then, I picked some cutoffs to place the labels at in the plot. These can be adjusted to whatever you want, but are at least a starting point for reasonably spaced ticks:

forLabels <-
  rep(c(1,2,5), times = 6) * rep(10^(3:8), each = 3)

Then, I manually set some things to append to the labels. Thus, instead of having to say "Thousands of years" under part of the axis, you can just label those with a "k". Each order of magnitude gets a value. Nnote that the names are just to help keep things straight: below I just use the index to match. So, if you skip the first two, you will need to adjust the indexing below.

toAppend <-
  c("1" = "0"
    , "2" = "00"
    , "3" = "k"
    , "4" = "0k"
    , "5" = "00k"
    , "6" = "M"
    , "7" = "0M"
    , "8" = "00M")

Then, I change my forLabels into the text versions I want to use by grabbing the first digit, and concatenating with the correct suffix from above.

myLabels <-
  paste0(
    substr(as.character(forLabels), 1, 1)
    , toAppend[floor(log10(forLabels))]
  )

This gives:

 [1] "1k"   "2k"   "5k"   "10k"  "20k"  "50k"  "100k" "200k" "500k" "1M"   "2M"  
[12] "5M"   "10M"  "20M"  "50M"  "100M" "200M" "500M"

기본 그래픽에이를 사용할 수 있지만 원하는 작업을 수행하기 위해 로그 스케일을 얻는 것이 때때로 까다 롭습니다. 대신 ggplot2솔루션에 열려 있다고 말 했으므로이 답변 에서 수정 된 로그 스케일 을 가져와 큰 것에서 작은 것까지 실행되는 로그 스케일을 얻었습니다.

library("scales")
reverselog_trans <- function(base = exp(1)) {
  trans <- function(x) -log(x, base)
  inv <- function(x) base^(-x)
  trans_new(paste0("reverselog-", format(base)), trans, inv, 
            log_breaks(base = base), 
            domain = c(1e-100, Inf))
}

그런 다음 데이터를 전달하고 원하는 중단으로 스케일을 설정하십시오.

ggplot(longerTest
       , aes(x = Year
             , y = T)) +
  geom_line() +
  scale_x_continuous(
    breaks = forLabels
    , labels = myLabels
    , trans=reverselog_trans(10)
  )

제공 :

여기에 이미지 설명 입력

척도는 일관되지만 훨씬 더 균일하게 레이블이 지정됩니다.

색상을 원하는 경우 다음을 사용하여 수행 할 수 있습니다 cut.

ggplot(longerTest
       , aes(x = Year
             , y = T
             , col = cut(log10(Year)
                         , breaks = c(3,6,9)
                         , labels = c("Thousands", "Millions")
                         , include.lowest = TRUE)
             , group = 1
             )) +
  geom_line() +
  scale_x_continuous(
    breaks = forLabels
    , labels = myLabels
    , trans=reverselog_trans(10)
  ) +
  scale_color_brewer(palette = "Set1"
                     , name = "How long ago?")

여기에 이미지 설명 입력

다음은 facet_wrap다른 스케일을 만드는 데 사용하는 버전 입니다. 여기서 6을 사용했지만 대신 원하는 임계 값을 설정할 수 있습니다.

longerTest$Period <-
  cut(log10(longerTest$Year)
      , breaks = c(3, 4, 5, 6, 7, 8, 9)
      , labels = paste(rep(c("", "Ten", "Hundred"), times = 2)
                       , rep(c("Thousands", "Millions"), each = 3) )
      , include.lowest = TRUE)

longerTest$Period <-
  factor(longerTest$Period
        , levels =  rev(levels(longerTest$Period)))


newBreaks <-
  rep(c(2,4,6,8, 10), times = 6) * rep(10^(3:8), each = 5)

newLabels <-
  paste0(
    substr(as.character(newBreaks), 1, 1)
    , toAppend[floor(log10(newBreaks))]
  )

ggplot(longerTest
       , aes(x = Year
             , y = T
       )) +
  geom_line() +
  facet_wrap(~Period, scales = "free_x") +
  scale_x_reverse(
    breaks = newBreaks
    , labels = newLabels
  )

제공합니다 :

여기에 이미지 설명 입력

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

MATLAB의 서브 플롯에서 동일한 길이의 틱 축

분류에서Dev

멀티 플롯에서 동일한 길이의 틱

분류에서Dev

R의 균일 한 플롯 포인트-연구 / HW

분류에서Dev

서브 플롯의 한 틱에서만 matplotlib를 사용하여 트리 플롯의 소수 자릿수 변경

분류에서Dev

균일 한 간격의 색상이있는 컬러 바에 대해 균일하지 않은 (불규칙) 간격의 데이터

분류에서Dev

두 개의 서브 플롯에 대해 동일한 수의 틱을 설정하는 방법은 무엇입니까?

분류에서Dev

그룹의 모든 열이 R에서 균일한지 확인

분류에서Dev

거대한 이진 데이터 파일의 gnuplot 플롯 제한

분류에서Dev

한 플롯이 선형이고 다른 플롯이 로그인 경우 틱 간격은 이중 Y 축 플롯의 두 y 축에 대한 로그입니다.

분류에서Dev

맵 형태의 서브 플롯에 대해 균일 한 색상 스케일을 갖는 방법은 무엇입니까?

분류에서Dev

일련의 문자열에 대한 평균을 계산 한 다음 R에서 평균의 2SD보다 큰 것을 제거합니다.

분류에서Dev

단일 페이지 API에 대한 Google 애널리틱스

분류에서Dev

Google 애널리틱스가 일부 페이지에 대한 추적을 표시하지 않습니다.

분류에서Dev

R에서 동일한 시계열 플롯에 대한 많은 색상이 가능합니까?

분류에서Dev

개수 플롯과 평균을 동일한 플롯 SNS에 병합

분류에서Dev

동일하지 않은 길이 목록을 균일 한 길이로 변환

분류에서Dev

일부 열에 대한 평균 사용

분류에서Dev

matplotlib의 2D 플롯에 대한 축 평균

분류에서Dev

단일 플롯의 범주 데이터에 대한 여러 막대 플롯

분류에서Dev

매일 페이지의 PV에 대한 쿼리-Bigquery-Google 애널리틱스

분류에서Dev

R에 대한 플롯의 등고선 플롯에서 범례 제거

분류에서Dev

R에서 균일하지 않은 간격의 x 축 눈금으로 점을 세로로 그리는 방법

분류에서Dev

R에서 임의의 균일 한 포리스트에 대해 하나의 ID 교차 유효성 검사를 남겨 둡니다.

분류에서Dev

R의 동일한 플롯에서 행렬의 여러 열을 그리는 방법은 무엇입니까?

분류에서Dev

이미지를 균일 한 위치에 배치하는 방법

분류에서Dev

R의 qplot 막대 플롯에 대한 두 가지 질문

분류에서Dev

CSS 이미지 갤러리에서 균일 한 상자 높이 설정

분류에서Dev

R에서`plot_grid`를 사용하여 플롯 배열의 플롯 한 열의 플롯 여백을 줄이는 방법은 무엇입니까?

분류에서Dev

python-GROUPED 밀도 플롯에서 평균선에 대한 y 축 제한 일반화

Related 관련 기사

  1. 1

    MATLAB의 서브 플롯에서 동일한 길이의 틱 축

  2. 2

    멀티 플롯에서 동일한 길이의 틱

  3. 3

    R의 균일 한 플롯 포인트-연구 / HW

  4. 4

    서브 플롯의 한 틱에서만 matplotlib를 사용하여 트리 플롯의 소수 자릿수 변경

  5. 5

    균일 한 간격의 색상이있는 컬러 바에 대해 균일하지 않은 (불규칙) 간격의 데이터

  6. 6

    두 개의 서브 플롯에 대해 동일한 수의 틱을 설정하는 방법은 무엇입니까?

  7. 7

    그룹의 모든 열이 R에서 균일한지 확인

  8. 8

    거대한 이진 데이터 파일의 gnuplot 플롯 제한

  9. 9

    한 플롯이 선형이고 다른 플롯이 로그인 경우 틱 간격은 이중 Y 축 플롯의 두 y 축에 대한 로그입니다.

  10. 10

    맵 형태의 서브 플롯에 대해 균일 한 색상 스케일을 갖는 방법은 무엇입니까?

  11. 11

    일련의 문자열에 대한 평균을 계산 한 다음 R에서 평균의 2SD보다 큰 것을 제거합니다.

  12. 12

    단일 페이지 API에 대한 Google 애널리틱스

  13. 13

    Google 애널리틱스가 일부 페이지에 대한 추적을 표시하지 않습니다.

  14. 14

    R에서 동일한 시계열 플롯에 대한 많은 색상이 가능합니까?

  15. 15

    개수 플롯과 평균을 동일한 플롯 SNS에 병합

  16. 16

    동일하지 않은 길이 목록을 균일 한 길이로 변환

  17. 17

    일부 열에 대한 평균 사용

  18. 18

    matplotlib의 2D 플롯에 대한 축 평균

  19. 19

    단일 플롯의 범주 데이터에 대한 여러 막대 플롯

  20. 20

    매일 페이지의 PV에 대한 쿼리-Bigquery-Google 애널리틱스

  21. 21

    R에 대한 플롯의 등고선 플롯에서 범례 제거

  22. 22

    R에서 균일하지 않은 간격의 x 축 눈금으로 점을 세로로 그리는 방법

  23. 23

    R에서 임의의 균일 한 포리스트에 대해 하나의 ID 교차 유효성 검사를 남겨 둡니다.

  24. 24

    R의 동일한 플롯에서 행렬의 여러 열을 그리는 방법은 무엇입니까?

  25. 25

    이미지를 균일 한 위치에 배치하는 방법

  26. 26

    R의 qplot 막대 플롯에 대한 두 가지 질문

  27. 27

    CSS 이미지 갤러리에서 균일 한 상자 높이 설정

  28. 28

    R에서`plot_grid`를 사용하여 플롯 배열의 플롯 한 열의 플롯 여백을 줄이는 방법은 무엇입니까?

  29. 29

    python-GROUPED 밀도 플롯에서 평균선에 대한 y 축 제한 일반화

뜨겁다태그

보관