Как смешать aes_ () и арифметический расчет в ggplot2? - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь настроить x и ymax в следующем сценарии в пакете ggplot2 в R, чтобы настроить координаты построения errorbar, однако он возвращает ошибки.

  gplot <- function(prd) {

        ggplot() +
        geom_polygon(data=shp.t,aes(x=long,y=lat,group=group),
                      fill="white",colour="grey") +
        ## Plot errorbar
        geom_errorbar(data=te10.cent,size=2,colour="red",
                      alpha=.8,width=0,
                      aes_(x=quote(long.cent)-350,ymin=quote(lat.cent),       
                                 ymax=quote(lat.cent)+prd))
        }
gplot("Field Name") # Not number but field name of the data frame

(Извините, я не могу загрузить фактический фрейм данных, который я использую.)

Вот ошибки, с которыми я сталкиваюсь:

Error in quote(lat.cent) + prd * .pt : non-numeric argument to binary Operator
Error in quote(lat.cent)+prd * .pt : non-numeric argument to binary Operator

Это работает вв обоих случаях -350 и +prd исключены из сценария или используются «aes» с фактической переменной во фрейме данных.Я пробовал другие скрипты;"long.cent"-350 и "lat.cent"+prd вместо приведенного выше сценария, однако он также возвращает ту же ошибку.

Я искал решения, но все они объясняют, как использовать aes_ без смешивания аргументов и арифметических вычислений.Мне нужно смешать нестандартное выражение с арифметическим вычислением, чтобы скорректировать мой график, но как?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

С выходом ggplot2 2.3.0 (который будет выпущен в конце июня 2018 года), aes_(...) не рекомендуется, и рекомендуется использовать tidy eval.В данном контексте это означает, что вы пишете !!prd, когда вам нужно содержимое переменной prd вместо символа prd.

library(ggplot2)
library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union

iris %>%
  group_by(Species) %>%
  summarise_all(~mean(.)) -> summed_iris

gplot <- function(prd){
  ggplot(summed_iris) +
    geom_col(aes(x = Species, y = Sepal.Length)) +
    geom_errorbar(
      aes(x = Species, ymin = Sepal.Length - !!prd, ymax = Sepal.Length + !!prd)
    )
}

gplot(0.5)

Иесли вы хотите, чтобы функция gplot() могла принимать символы точно так же, как aes(), вам нужно добавить enquo() в начале определения функции.Он фиксирует выражение, которое было предоставлено функции, а также окружающую среду.

gplot <- function(prd){
  prd <- enquo(prd)
  ggplot(summed_iris) +
    geom_col(aes(x = Species, y = Sepal.Length)) +
    geom_errorbar(
      aes(x = Species, ymin = Sepal.Length - !!prd, ymax = Sepal.Length + !!prd)
    )
}

gplot(Petal.Length)

scale <- 1/5
gplot(scale*Petal.Length)

0 голосов
/ 11 июня 2018

Я надеюсь, что это решит вашу проблему:

gplot <- function(prd) {

  ggplot() +
    geom_polygon(data = shp.t,
                 aes_(x = ~long,
                      y = ~lat,
                      group = ~group),
                 fill = "white",
                 colour = "grey") +
    ## Plot errorbar
    geom_errorbar(data = te10.cent,
                  size = 2,
                  colour = "red",
                  alpha = .8,
                  width = 0,
                  aes_(x = ~long.cent - 350,
                       ymin = ~lat.cent,       
                       ymax = ~lat.cent + prd))
}

Воспроизводимый пример:

некоторые данные:

library(tidyverse)

data(iris)

iris %>%
  group_by(Species) %>%
  summarise_all(~mean(.)) -> summed_iris

gplot <- function(prd){
  ggplot(summed_iris) +
    geom_col(aes_(x = ~Species,
                  y = ~Sepal.Length))+
    geom_errorbar(aes_(x = ~Species,
                       ymin = ~Sepal.Length -prd,
                       ymax = ~Sepal.Length + prd))

}

gplot(0.5)

enter image description here

РЕДАКТИРОВАТЬ: к вопросу в комментарии:

В случае, когда prd является именем столбца данных, возможно, лучше предварительно вычислить значения:

gplot <- function(prd){
  ymin <-  with(summed_iris, get("Sepal.Length") - get(prd))
  ymax <-  with(summed_iris, get("Sepal.Length") + get(prd))
  summed_iris <- data.frame(summed_iris, ymin, ymax)
  ggplot(summed_iris) +
    geom_col(aes_(x = ~Species,
                  y = ~Sepal.Length))+
    geom_errorbar(aes_(x = ~Species,
                       ymin = ~ymin,
                       ymax = ~ymax))

}
gplot("Petal.Length")

enter image description here

...