ggplot2 - создать барплот для каждого столбца кадра данных - PullRequest
0 голосов
/ 15 октября 2018

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

Вот данные:

> dfslices
        X0035.A061 X0094.B116 X0314.A038
verylow   19.48052   8.127208 36.8243243
low        2.96846   9.069494  7.4324324
medium     0.00000   2.237927  0.3378378
high       0.00000   0.000000  1.6891892

В основном мне нужно 1 барплот для каждого столбца (X0035.A061, X0094.B116 и X0314.A038).У каждого барплота есть 4 бара (один бар соответствует очень низкой категории, другой - минимуму, другой - средней и другой - максимуму).И было бы здорово, чтобы заголовки графиков были (X0035.A061, X0094.B116 и X0314.A038), и каждый столбец графика имел соответствующую метку (очень низкая, низкая, средняя и высокая)

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вот одно решение проблемы с использованием пакета data.table для функций melt() и fread() и использованием facet_grid() из ggplot2 для построения всех 3 ваших исходных столбцов в виде отдельных панелей на однойучасток.

library(data.table)
library(ggplot2)

# Convert text data to data.table using fread() from the data.table package.
dfslice = fread("category X0035.A061 X0094.B116 X0314.A038
                 verylow    19.48052   8.127208 36.8243243
                 low         2.96846   9.069494  7.4324324
                 medium      0.00000   2.237927  0.3378378
                 high        0.00000   0.000000  1.6891892")

# Convert data to 'long form' using melt() from the data.table package.
mtab = melt(dfslice, id.vars="category")

# Manually set factor levels of 'category' column to plot in a logical order.
mtab$category = factor(mtab$category, 
                       levels=c("verylow", "low", "medium", "high"))

mtab
#     category   variable      value
#  1:  verylow X0035.A061 19.4805200
#  2:      low X0035.A061  2.9684600
#  3:   medium X0035.A061  0.0000000
#  4:     high X0035.A061  0.0000000
#  5:  verylow X0094.B116  8.1272080
#  6:      low X0094.B116  9.0694940
#  7:   medium X0094.B116  2.2379270
#  8:     high X0094.B116  0.0000000
#  9:  verylow X0314.A038 36.8243243
# 10:      low X0314.A038  7.4324324
# 11:   medium X0314.A038  0.3378378
# 12:     high X0314.A038  1.6891892

p = ggplot(data=mtab, aes(x=category, y=value, fill=category)) +
    geom_bar(stat="identity") +
    scale_fill_viridis_d() +
    facet_grid(. ~ variable)

ggsave("faceted_barplot.png", plot=p, width=7.5, height=2.5, dpi=150)

enter image description here

0 голосов
/ 15 октября 2018

Вот один из вариантов

library(purrr)
library(tibble) # rownames_to_column
library(ggplot2)
plots <- split.default(dfslices, names(dfslices)) %>% 
  map(., setNames, nm = "col") %>% 
  map(., rownames_to_column) %>%
  map(., mutate, rowname = factor(rowname, levels = c("verylow", "low", "medium", "high"))) %>% 
  imap(., ~ {
    ggplot(.x, aes(rowname, col)) + 
      geom_col() +
      labs(title = .y)
    })

plots$X0035.A061

enter image description here

Идея состоит в создании списка фреймов данных, каждый из которых содержит один столбец dfslices,Мы используем split.default для создания этого списка.

В следующих двух строках мы переименовываем столбцы в каждом кадре данных в «col» и для каждого кадра данных преобразуем его имена строк в явный столбец.На следующем шаге преобразуйте столбец rowname в множитель и установите его уровни соответственно.

Наконец, можно использовать imap для итерации списка и над именами этого списка, которые обозначены .y.Мы используем .y в качестве аргумента для labs, чтобы заголовок каждого графика соответствовал (прежнему) имени столбца.

данные

dfslices <- structure(list(X0035.A061 = c(19.48052, 2.96846, 0, 0), X0094.B116 = c(8.127208, 
9.069494, 2.237927, 0), X0314.A038 = c(36.8243243, 7.4324324, 
0.3378378, 1.6891892)), .Names = c("X0035.A061", "X0094.B116", 
"X0314.A038"), class = "data.frame", row.names = c("verylow", 
"low", "medium", "high"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...