ggplot2 изменяет / преобразует переменные размера — как вернуть исходные данные?

#r #ggplot2

#r #ggplot2

Вопрос:

ggplot2, похоже, изменяет / преобразует переменные размера.

Рассмотрим следующее

 require(ggplot2); require(dplyr)
set.seed(1234)
d <- data.frame(x = rnorm(100), y = rnorm(100), size = runif(100))
p.out <- ggplot(d, aes(x, y, size = size))   geom_point()
p.data <- p.out %>% layer_data %>% arrange(x)
d2 <- d %>% arrange(x)
head(d2)
             x           y      size
## 1 -2.345698 -0.50247778 0.7757949
## 2 -2.180040 -0.31611833 0.3802893
## 3 -1.806031 -0.37723765 0.2547007
## 4 -1.629093 -1.65010093 0.2722072
## 5 -1.448205  0.08005964 0.1999333
## 6 -1.390701 -1.12376279 0.5117742

p.data %>% select(size, x, y) %>% head

##       size         x           y
## 1 5.407443 -2.345698 -0.50247778
## 2 4.084550 -2.180040 -0.31611833
## 3 3.523348 -1.806031 -0.37723765
## 4 3.608829 -1.629093 -1.65010093
## 5 3.234916 -1.448205  0.08005964
## 6 4.579018 -1.390701 -1.12376279
  

x и y, похоже, соответствуют исходным данным

 lm(y ~ x, p.data)


## Call:
## lm(formula = y ~ x, data = p.data)
## 
## Coefficients:
## (Intercept)            x  
##     0.03715     -0.02608  

lm(y ~ x, d)

## Call:
## lm(formula = y ~ x, data = d)
## 
## Coefficients:
## (Intercept)            x  
##     0.03715     -0.02608  
  

Но переменная размера, похоже, каким-то образом мутировала / трансформировалась

 cor(p.data$size, d2$size)
## [1] 0.9783827

lm(y ~ x, data = d, weights = size)

## Call:
## lm(formula = y ~ x, data = d, weights = size)
## 
## Coefficients:
## (Intercept)            x  
##    -0.02586     -0.11537  

lm(y ~ x, p.data, weights = size)

## Call:
## lm(formula = y ~ x, data = p.data, weights = size)
## 
## Coefficients:
## (Intercept)            x  
##     0.009372    -0.065445  
  

ggplot2, похоже, создает правильный график, когда я использую исходные данные, но, похоже, я не могу воспроизвести график из layer_data() или от ggplot_build() . Как я могу преобразовать size переменную в p.data , чтобы вернуть исходную переменную размера?

Комментарии:

1. Хорошая находка. Как насчет p.out$data ?

2. О, хороший звонок! Я не знал об p.out$data .. p.out$data выдает мне фактические данные, поскольку cor(p.out.data$size, d2$size) они равны 1 (когда я упорядочиваю все по x), но cor(p.out.data$size, p.data$size) равны 0,978, как указано выше. Я не уверен, что здесь происходит. Я попробовал несколько способов, описанных выше, и я не думаю, что в моем коде ошибка. В конце концов, p.out $ data дает мне то, что я хочу. Не стесняйтесь отвечать, и я соглашусь…

Ответ №1:

Происходит что-то интересное, возможно, кто-то, более близко знакомый с ggplot2, может присоединиться. Тем временем попробуйте вызвать данные из объекта ggplot напрямую с помощью p.out$data .

Комментарии:

1. Еще один краткий комментарий: Преимущество layer_data и ggplot_build в том, что они изменили имена на «x», «y», «size» и т.д. p.out$data будут использоваться имена по умолчанию, указанные пользователем, а затем нужно использовать p.out$mapping , чтобы выяснить, какие переменные соответствуют осям x и y и т.д.