Барплот с двумя переменными рядом друг с другом

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

Мои данные довольно просты.

aov.data
   Block    RTreg    RTrnd
1 Block1   0.0000 862.0707 
2 Block2 667.2081 770.4315 
3 Block3 645.4730 696.0200
4 Block4 674.5200 659.4765
5 Block5 651.4295 633.7333

Что я хочу получить, так это столбчатую диаграмму со столбцом Block по оси x, работающую как категориальная переменная. По оси Y я хочу получить значения для построения столбцов RTreg и RTrnd. Это та часть, которую я не могу понять правильно. То, что я хотел бы, это иметь два бара на отметку по оси X. Один столбец, представляющий значение RTreg в этом блоке, и один столбец, представляющий значение RTrnd в этом блоке. Примерно так:

Valid XHTML.

Но с 5 комплектами по два бара вместо двух.

До сих пор я использовал следующий код:

ggplot(aov.data,aes(x=Block)) + 
          geom_bar(aes(y=RTreg),stat="identity",position="dodge",col="blue") +
          geom_bar(position="dodge") +   
          geom_bar(aes(y=RTrnd),stat="identity",position="dodge",col="red")

Я подумал, что сначала должен был создать базовый график с категориальной осью x, содержащей блоки. Затем, с geom_bar я подумал, что сначала добавляю столбец RTreg, а со вторым geom_bar я добавляю столбец RTrnd. С опцией position, равной dodge, я собирался получить два бара рядом. Тем не менее, сюжет, который я получаю:

Valid XHTML .

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

Заранее спасибо.

Ответ 1

Вы должны переделать свой фрейм данных с широкого до длинного, и тогда вам не нужно устанавливать бары для каждого условия отдельно.

Предполагая, что фрейм данных имеет имя df.

library(reshape2)
df.long<-melt(df)
ggplot(df.long,aes(Block,value,fill=variable))+
     geom_bar(stat="identity",position="dodge")

enter image description here

Ответ 2

Альтернативный подход с использованием собственных функций R:

#Taking the Dataset mentioned in the question
df = data.frame(Block = c("Block 1", "Block 2", "Block 3", "Block 4", "Block 5"), RTreg = c(0.0,667.208,645.47,674.52,651.42), RTrnd = c(862.07,770.43,696.02,659.476,633.733))

#Create a Matrix which will help in creating the plot
value_matrix = matrix(, nrow = 2, ncol = 5)
#An empty matrix is a necessary requirement prior to copying data
value_matrix[1,] = df$RTreg 
value_matrix[2,] = df$RTrnd

#Note that the "beside" argument has to be kept "TRUE" in order to place the bars side by side
barplot(value_matrix, names.arg = df$Block, beside = TRUE, col = c("peachpuff", "skyblue"), legend.text = c("RTreg", "RTrnd"))

Что происходит выше?

Чтобы ответить на этот вопрос, я сначала хотел бы обратить ваше внимание на первый аргумент barplot() то есть 'height'. Теперь, если вы предоставите вектор в качестве входных данных, то функция сгенерирует обычную гистограмму, как вы и ожидаете. Однако для построения кластеризованной гистограммы вы должны будете предоставить данные в матричном формате. Теперь здесь приходит в магии. Для кластеризованной гистограммы ваши переменные должны присутствовать в строках матрицы, а не в обычных столбцах. Я хочу сказать, вместо того, чтобы хранить данные по столбцам:

   RTreg     RTrnd
1  0.0000    862.0707 
2  667.2081  770.4315 
3  645.4730  696.0200

сохранить данные по строкам:

       1        2        3
RTreg  0.0000   667.2081 645.4730
RTrnd  862.0707 770.4315 696.0200

Именно так barplot() распознает 2 разные переменные "RTreg" и "RTrnd". Если у вас есть m других переменных, которые вы хотите поместить в кластер, просто скопируйте их в строки матрицы после задания аргумента nrow matrix() в m. Теперь, чтобы получить указанную выше структуру, я просто создал пустую матрицу и скопировал "RTreg" и "RTrnd" в строки 1 и 2 соответственно. Как только матрица создана, тогда вы готовы. Просто вызовите barplot() вместе с вашей матрицей в качестве аргумента высоты и не забудьте установить для аргумента "рядом" значение ИСТИНА.

Результат приведенного выше кода:

enter image description here