Сложенный барплот, возвращающий отдельные бары - PullRequest
2 голосов
/ 15 февраля 2020

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

Person   Count   Color
Jim   35   Y
Jim   10   N
Jenny   12   Y
Jenny   25   N

Итак, я ожидаю, что бары Джима будут накладываться друг на друга, а Дженни будет следующей его стопкой. Но это не то, что происходит, полосы присутствуют, но они находятся рядом друг с другом, несмотря на принадлежность к одному и тому же человеку.

Код, который я пробовал

barplot(count, col = color) ##this will get me the unstacked bars


###what I have seen as examples but I already have a table...
count = table (person, count)
count
barplot(count, col = color)

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

Функция barplot (из графического пакета) требует либо вектора, либо матрицы значений, описывающих столбцы, составляющие график. Не фрейм данных. Итак, если ваши данные имеют такую ​​структуру:

> X <- matrix(c(12,25,35,10), nr=2)
> dimnames(X) <- list(Color=c("Y","N"), Person=c("Jenny","Jim"))
> X
     Person
Color Jenny Jim
    Y    12  35
    N    25  10

Что представляет собой таблицу отсчетов 2x2, то вы можете легко построить это:

> barplot(X)

Конечно, R обычно дает минимальный результат В том числе графики, чтобы сделать его более презентабельным, вам нужно добавить несколько аргументов.

op <- par(mar=par("mar") + c(0,0,0,1)) # add some space for the legend on the right, saving the original pars
barplot(X, xlab="Person", ylab="Count", # add axis labels
        las=1, # make tick labels horizontal
        col=c("turquoise2","tomato"), border="white", # change colors
        legend=TRUE, # add a legend with some parameters...
        args.legend=list(x="right", title="Color", bt="n", border="white", inset=-0.2)
        )
par(op) # restore original graphical parameters

enter image description here

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

0 голосов
/ 15 февраля 2020

Как правильно сказал @Edward, вам нужна таблица, а не data.frame. На всякий случай, если вам это нужно (и для удовольствия), вы можете использовать dplyr для приведения его в матрицу и построить график:

library(tidyr)
library(dplyr)

df %>% pivot_wider(values_from=Count,names_from=Person) %>% tibble::column_to_rownames("Color") %>% 
{barplot(as.matrix(.),col=c("turquoise","orange"))}

enter image description here

...