Программные круговые диаграммы с ggplot2 - PullRequest
2 голосов
/ 23 декабря 2019

Я использую следующий код для создания двух параллельных круговых диаграмм

library(ggplot2)
mtcars$cyl <- factor(mtcars$cyl) # converts to a categorical variable
mtcars$gear <- factor(mtcars$gear) # converts to a categorical variable

p <- ggplot(data=mtcars, aes(x=factor(1), stat="bin", fill=cyl)) + geom_bar(position="fill") # Stacked bar chart
p <- p + ggtitle("Cylinders by Gears") + xlab("") + ylab("Gears") # Adds titles
p <- p + facet_grid(facets=. ~ gear) 
p <- p + coord_polar(theta="y") + theme_void()
p

Это работает хорошо, но, к сожалению, мне нужно сделать это программно. В частности, мне нужно иметь возможность изменять "fill = cyl" и "facets =. ~ Gear" на другие переменные как часть функции. В идеале я мог бы передавать имена переменных в виде строк в приведенном выше коде.

Я пытался использовать aes_string() и quote / substitute, но каждый раз получал непредвиденные результаты. Пожалуйста, сообщите.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2019

Для аргумента fill мы можем использовать sym, чтобы преобразовать строку в символ и затем оценить ее с помощью !!, тогда как для facet_grid мы можем использовать reformulate.

library(ggplot2)
library(rlang)

apply_fun <- function(data, fill_col, facet_col) {
   ggplot(data=data, aes(x=factor(1), stat="bin", fill= !!sym(fill_col))) + 
        geom_bar(position="fill")  + 
        ggtitle("Cylinders by Gears") + xlab("") + ylab("Gears") +
        facet_grid(reformulate(facet_col, ".")) +
        coord_polar(theta="y") + theme_void()
}

apply_fun(mtcars, "cyl", "gear")

enter image description here

1 голос
/ 23 декабря 2019

Вы можете определить свои переменные перед функцией построения:

Var1 = "cyl"
Var2 = "gear"

И затем использовать эти переменные в своей функции построения графика:

ggplot(data=mtcars, aes(x=factor(1), stat="bin", fill=mtcars[,Var1])) + 
  geom_bar(position="fill") + 
  ggtitle("Cylinders by Gears") + xlab("") + ylab("Gears") + 
  facet_grid(facets=. ~ mtcars[,Var2]) + 
  coord_polar(theta="y") + theme_void()

Если вы хотите написать функцию, используя эту, вы можете сделать:

plot_function = function(dataset,Var1,Var2) {
  ggplot(data=dataset, aes(x=factor(1), stat="bin", fill=dataset[,Var1])) + 
    geom_bar(position="fill") + 
    ggtitle(paste0(Var1, " by ", Var2)) + xlab("") + ylab(Var2) + 
    guides(fill = guide_legend(title = Var1))+
    facet_grid(facets=. ~ dataset[,Var2]) + 
    coord_polar(theta="y") + theme_void()
}

И использовать это так:

plot_function(mtcars, "cyl","gear")

Отвечает ли он на ваш вопрос?

...