2016-10-23 4 views
0

В настоящее время я пытаюсь создать столбчатую диаграмму на основе ниже набор данных:столбчатого чат (ggplot) в R :: Попытка создать более одного бар на графике

Dataset Example

Расшифровка data: Каждая нечетная колонка представляет собой переменную компании, и каждая четная колонка представляет продукцию этой компанией. Каждые две колонки (компания и производство) представляют производственные образцы за этот час.

Это мои данные:

structure(list(Hour = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), X1 = structure(c(4L, 
5L, 5L, 5L, 5L, 2L, 3L, 5L, 5L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L), .Label = c("", "B", "C", "Company", "D"), class = "factor"), 
    X1.1 = structure(c(10L, 5L, 7L, 9L, 2L, 4L, 8L, 3L, 6L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
    "30", "31", "49", "5", "63", "73", "83", "86", "Production" 
    ), class = "factor"), X2 = structure(c(4L, 5L, 2L, 5L, 5L, 
    2L, 5L, 5L, 2L, 3L, 2L, 2L, 3L, 5L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L), .Label = c("", "A", "B", "Company", "D"), class = "factor"), 
    X2.1 = structure(c(15L, 10L, 12L, 6L, 11L, 13L, 3L, 14L, 
    5L, 4L, 2L, 9L, 8L, 7L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
    "15", "32", "34", "36", "5", "50", "52", "58", "71", "73", 
    "74", "78", "98", "Production"), class = "factor"), X3 = structure(c(5L, 
    2L, 2L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 4L, 6L, 4L, 3L, 3L, 
    1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "A", "B", "C", "Company", 
    "D"), class = "factor"), X3.1 = structure(c(17L, 6L, 15L, 
    3L, 4L, 16L, 13L, 7L, 11L, 9L, 5L, 8L, 10L, 14L, 12L, 2L, 
    1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "1", "11", "14", 
    "19", "33", "42", "43", "50", "57", "68", "81", "82", "84", 
    "85", "95", "Production"), class = "factor"), X4 = structure(c(4L, 
    5L, 1L, 1L, 5L, 5L, 5L, 5L, 1L, 1L, 5L, 5L, 3L, 3L, 3L, 5L, 
    2L, 2L, 5L, 2L, 5L, 5L), .Label = c("A", "B", "C", "Company", 
    "D"), class = "factor"), X4.1 = structure(c(21L, 1L, 18L, 
    12L, 20L, 10L, 5L, 6L, 4L, 11L, 16L, 9L, 3L, 7L, 13L, 19L, 
    8L, 17L, 4L, 2L, 15L, 14L), .Label = c("100", "2", "24", 
    "28", "3", "38", "4", "40", "42", "43", "47", "48", "54", 
    "64", "69", "7", "71", "81", "9", "97", "Production"), class = "factor"), 
    X5 = structure(c(5L, 6L, 6L, 3L, 6L, 6L, 6L, 6L, 2L, 2L, 
    6L, 6L, 6L, 3L, 6L, 3L, 6L, 3L, 4L, 1L, 1L, 1L), .Label = c("", 
    "A", "B", "C", "Company", "D"), class = "factor"), X5.1 = structure(c(18L, 
    12L, 3L, 9L, 14L, 10L, 16L, 2L, 17L, 13L, 5L, 13L, 4L, 7L, 
    6L, 2L, 15L, 11L, 8L, 1L, 1L, 1L), .Label = c("", "0", "1", 
    "12", "25", "30", "34", "38", "39", "45", "46", "58", "60", 
    "68", "73", "78", "97", "Production"), class = "factor"), 
    X6 = structure(c(5L, 3L, 4L, 3L, 6L, 6L, 3L, 3L, 2L, 3L, 
    6L, 3L, 6L, 3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
    "A", "B", "C", "Company", "D"), class = "factor"), X6.1 = structure(c(16L, 
    9L, 4L, 5L, 8L, 11L, 15L, 6L, 10L, 7L, 14L, 3L, 12L, 2L, 
    13L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", "1", "29", 
    "3", "34", "4", "42", "48", "65", "68", "70", "8", "92", 
    "95", "96", "Production"), class = "factor")), .Names = c("Hour", 
"X1", "X1.1", "X2", "X2.1", "X3", "X3.1", "X4", "X4.1", "X5", 
"X5.1", "X6", "X6.1"), class = "data.frame", row.names = c(NA, 
-22L)) 

Я был в состоянии использовать этот код, чтобы создать диаграмму в течение первого часа:

dataset <- read_excel("Example.csv") 
hour = 1 
Production <- dataset[, 2] 
Company <- dataset[, 1] 
ggplot(data = dataset, aes(x = hour, y = Production, fill = Company)) + 
    geom_bar(stat = "identity") 

Гистограмма изображена ниже:

Bar Chart

Теперь проблема:

Я написал код для создания набора данных для переменной «Компания» и переменной «Производство». Но когда я запускаю код, у меня есть эта ошибка:

Aesthetics must be either length 1 or the same as the data (21): x, y, fill 

Я интересно, что техническая ошибка я совершаю, и как я могу решить эту проблему. Это мой код:

hour <- matrix(0, 1, 2) 
hour[1, 1] = 1 
hour[1, 2] = 2 
Production <- matrix(0, 22, 2) 
for (i in 1:2) { 
    Production[1:22, i] <- dataset[1:22, (2 * i)] 
} 
Company <- matrix(0, 22, 2) 
for (i in 1:2) { 
    Company[1:22, i] <- dataset[1:22, (2 * i) - 1] 
} 

Любая помощь будет принята с благодарностью.

+1

Пожалуйста, поставьте набор данных в полезный формат. Не изображение, например. используйте 'dput (dataset)'. – Deleet

+0

Эй, Деле, я только что разместил его. Это помогает? –

+1

ggplot не любит матрицы; только data.frames. Вам нужно структурировать свои данные, чтобы каждая эстетика представляла собой единую переменную в вашем файле data.frame. Прямо сейчас, это не то, что у вас есть, и то, что у вас есть, непонятно. – alistaire

ответ

0

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

Во-первых, ggplot2 работает с data.frames, где каждая переменная является другим столбцом, поэтому ваш первый шаг должен состоять в том, чтобы преобразовать ваши данные в this format. Есть несколько способов сделать это.

При том, что это очень легко получить то, что вам нужно:

ggplot(data = df2, aes(x = Hour, y = Production, fill = Company)) + 
    geom_bar(stat = 'identity') 

enter image description here

Кроме того, вы можете устранить повторяющиеся цвета в наборной строке, так что вы можете увидеть, что общий объем производства для каждая компания проще. Для этого вам нужно будет использовать weight эстетики вместо identity стата, как это:

ggplot(data = df2, aes(x = Hour, weight = Production)) + 
    geom_bar(aes(fill = Company)) 

enter image description here

Надеется, что это помогает!

+0

Ты полностью споткнулся о моем человеке! Я тоже это понял. Спасибо огромное! не могу поверить, что мне так долго приходилось разбираться в обходном пути –

0

Непонятно, что вы пытаетесь сделать. Например. ваши переменные в data.frame не называются правильно, а Hour даже не в data.frame.

ggplot2 требует, чтобы все ваши переменные были в data.frame, который вы предоставили (это код dataset в вашем коде). Вы создаете новые объекты с разумными именами за пределами data.frame. Вместо этого вы должны переименовать переменные. Часовая переменная - длина 1, поэтому непонятно, что вы пытаетесь с ней сделать.

Это лучшее, что я мог придумать на основе кода:

#load data 
dataset = structure(list(X1 = structure(c(4L, 4L, 4L, 4L, 2L, 3L, 4L, 4L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
"B", "C", "D"), class = "factor"), X1.1 = c(5L, 73L, 86L, 30L, 
49L, 83L, 31L, 63L, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA), X2 = structure(c(4L, 2L, 4L, 4L, 2L, 4L, 4L, 2L, 3L, 
2L, 2L, 3L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
"A", "B", "D"), class = "factor"), X2.1 = c(71L, 74L, 5L, 73L, 
78L, 32L, 98L, 36L, 34L, 15L, 58L, 52L, 50L, NA, NA, NA, NA, 
NA, NA, NA, NA), X3 = structure(c(2L, 2L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L, 5L, 4L, 5L, 4L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
"A", "B", "C", "D"), class = "factor"), X3.1 = c(33L, 85L, 11L, 
14L, 95L, 82L, 42L, 68L, 50L, 19L, 43L, 57L, 84L, 81L, 1L, NA, 
NA, NA, NA, NA, NA), X4 = structure(c(4L, 1L, 1L, 4L, 4L, 4L, 
4L, 1L, 1L, 4L, 4L, 3L, 3L, 3L, 4L, 2L, 2L, 4L, 2L, 4L, 4L), .Label = c("A", 
"B", "C", "D"), class = "factor"), X4.1 = c(100L, 81L, 48L, 97L, 
43L, 3L, 38L, 28L, 47L, 7L, 42L, 24L, 4L, 54L, 9L, 40L, 71L, 
28L, 2L, 69L, 64L), X5 = structure(c(5L, 5L, 3L, 5L, 5L, 5L, 
5L, 2L, 2L, 5L, 5L, 5L, 3L, 5L, 3L, 5L, 3L, 4L, 1L, 1L, 1L), .Label = c("", 
"A", "B", "C", "D"), class = "factor"), X5.1 = c(58L, 1L, 39L, 
68L, 45L, 78L, 0L, 97L, 60L, 25L, 60L, 12L, 34L, 30L, 0L, 73L, 
46L, 38L, NA, NA, NA), X6 = structure(c(3L, 4L, 3L, 5L, 5L, 3L, 
3L, 2L, 3L, 5L, 3L, 5L, 3L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("", 
"A", "B", "C", "D"), class = "factor"), X6.1 = c(65L, 3L, 34L, 
48L, 70L, 96L, 4L, 68L, 42L, 95L, 29L, 8L, 1L, 92L, NA, NA, NA, 
NA, NA, NA, NA)), .Names = c("X1", "X1.1", "X2", "X2.1", "X3", 
"X3.1", "X4", "X4.1", "X5", "X5.1", "X6", "X6.1"), class = "data.frame", row.names = c(NA, 
-21L)) 

#rename and add Hour 
names(dataset)[1:2] = c("Company", "Production") 
dataset$Hour = 1 

#plot 
library(ggplot2) 
ggplot(dataset, aes(Hour, Production, fill = Company)) + 
    geom_bar(stat = "identity") 

Выход из которых: enter image description here

Рассмотрим чтение a textbook on R первый и the ggplot2 textbook.

+0

Deleet, Спасибо за помощь. Выведенный вами результат - это то, что у меня есть сейчас, когда я ссылался в своем сообщении. Однако этот вывод предназначен только для первых двух столбцов данных. Как я могу создать другое право бара, которое использует данные из следующих двух столбцов данных? Я также переформатировал свои данные и заменил его на свой отредактированный пост. Спасибо –

Смежные вопросы