Применить ggplot2 к столбцам - PullRequest
0 голосов
/ 05 мая 2020

Я работаю с фреймом данных со многими столбцами и хотел бы создать определенные графики данных, используя ggplot2, а именно коробчатые диаграммы, гистограммы, графики плотности. Я хотел бы сделать это, написав одну функцию, которая применяется ко всем атрибутам (столбцам), создавая одну коробчатую диаграмму (или гистограмму и т. Д. c), а затем сохраняя ее как заданный элемент списка, в который будут включены все коробчатые диаграммы. , поэтому я мог позже проиндексировать его по номеру (или по имени столбца), чтобы вернуть график для данного атрибута.

Проблема в том, что если я попытаюсь применить к столбцам что-то вроде apply(df,2,boxPlot), я должен определить boxPlot как функцию, которая принимает только вектор x. И когда я это сделаю, имя атрибута / столбца и индекс больше не сохраняются. Так, например, в коде для создания блочной диаграммы, например

bp <- ggplot(df, aes(x=Group, y=Attr, fill=Group)) + 
  geom_boxplot() + 
  labs(title="Plot of length per dose", x="Group", y =paste(Attr)) + 
  theme_classic()

, функция не знает, как извлечь информацию, необходимую для Attr, только из вектора x (так как это только данные столбца и не t содержат имя столбца или индекс).

(Обратите внимание, что ось x - это факторная переменная, называемая «Группа», которая имеет 6 уровней A, B, C, D, E, F внутри X .)

Может кто поможет хорошим способом автоматизировать эту процедуру? (В идеале он должен работать для всех типов ggplots; проблема здесь, кажется, просто в том, как ссылаться на имя атрибута внутри функции ggplot таким образом, чтобы его можно было применять / автоматически реплицировать по столбцам.) A for-l oop было бы приемлемым, я думаю, но если есть более эффективный / лучший способ сделать это в R, я бы предпочел это!

Edit : что-то вроде того, что было бы достигается верхним ответом на этот вопрос: применить коробчатые диаграммы к нескольким переменным . За исключением того, что в этом ответе с его кодом вам все равно понадобится for -l oop, чтобы изменить индексы y = y [2] в коде ggplot и получить all boxplots. Он также расширил сетку, чтобы включить различные возможности `` x '' (у меня есть только один, фактор группы), но было бы легко упростить его, если бы проблема зацикливания могла быть решена.

Я бы также предпочел просто базовый R, если это возможно - dplyr, если это абсолютно необходимо.

1 Ответ

2 голосов
/ 05 мая 2020

Вот пример итерации по всем столбцам фрейма данных для создания списка графиков с сохранением имени столбца в метке оси ggplot

library(tidyverse)

plots <- 
  imap(select(mtcars, -cyl), ~ {
    ggplot(mtcars, aes(x = cyl, y = .x)) + 
      geom_point() +
      ylab(.y)
  })

plots$mpg

enter image description here

Вы также можете сделать это без Purrr и dplyr

to_plot <- setdiff(names(mtcars), 'cyl')

plots <- 
  Map(function(.x, .y) {
    ggplot(mtcars, aes(x = cyl, y = .x)) + 
      geom_point() +
      ylab(.y)
  }, mtcars[to_plot], to_plot)

plots$mpg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...