2016-10-23 5 views
0

ich derzeit ein gestapeltes Balkendiagramm auf der Basis des Datensatzes unten zu schaffen versuche:Stacked Bar Chat (ggplot) in R :: Der Versuch, mehr als ein Balken im Diagramm erstellen

Dataset Example

Erklärung Daten: Jede ungerade Spalte stellt die Unternehmensvariable dar und jede gerade Spalte stellt die Produktion von dieser Firma dar. Alle zwei Spalten (die Firma und die Produktion) repräsentieren die Produktionsmuster für diese Stunde.

Dies ist meine Daten:

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)) 

konnte ich unter den Code verwenden, um ein Diagramm für die erste Stunde zu erstellen:

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") 

Das Balkendiagramm unten dargestellt wird:

Bar Chart

Jetzt das Problem:

Ich habe einen Code geschrieben, um einen Datensatz für die Variable "Company" und die Variable "Production" zu erstellen. Aber wenn ich den Code ausführen, habe ich diesen Fehler:

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

Ich frage mich, was technischer Fehler bin ich zu begehen und wie kann ich dieses Problem lösen. Dies ist mein Code:

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] 
} 

Jede Hilfe wäre sehr dankbar.

+1

Bitte liefern Sie den Datensatz ist ein nützliches Format. Kein Bild, z.B. benutze 'dput (Dataset)'. – Deleet

+0

Hey Delete, ich habe es gerade gepostet. Hilft das? –

+1

ggplot mag keine Matrizen; nur data.frames. Sie müssen Ihre Daten so strukturieren, dass jede Ästhetik eine einzelne Variable in Ihrem Datenrahmen ist. Genau das hast du nicht, und was du hast, ist unklar. – alistaire

Antwort

0

Von dem, was ich in der Frage verstehe, versuchen Sie, ein Balkendiagramm zu erstellen, das die Produktion in jeder Stunde getrennt nach Unternehmen zeigt, wobei jeder Balken eine andere Stunde ist.

Erstens arbeitet ggplot2 mit data.frames, wobei jede Variable eine andere Spalte ist, also sollte der erste Schritt darin bestehen, Ihre Daten in this format zu konvertieren. Dafür gibt es mehrere Möglichkeiten.

Damit ist es sehr einfach zu bekommen, was Sie brauchen:

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

enter image description here

Auch möchten Sie vielleicht die wiederholten Farben in der gestapelten Balken eliminieren, so dass Sie, dass die Gesamtproduktion sehen können jedes Unternehmen einfacher. Dazu müssten Sie die weight Ästhetik anstelle des identity stat verwenden, wie folgt aus:

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

enter image description here

hoffe, das hilft!

+0

Sie sind total auf meinen Mann! Das habe ich auch gerade gemerkt. Ich danke dir sehr! Ich kann nicht glauben, dass es so lange gedauert hat, die Problemumgehung herauszufinden –

0

Es ist nicht klar, was Sie versuchen zu tun. Z.B. Ihre Variablen im data.frame sind nicht korrekt benannt, und Hour ist nicht einmal im data.frame.

ggplot2 erfordert, dass alle Variablen in dem von Ihnen angegebenen data.frame enthalten sind (das ist dataset in Ihrem Code). Sie erstellen neue Objekte mit sinnvollen Namen außerhalb des data.frame. Sie sollten stattdessen die Variablen umbenennen. Die Stundenvariable ist Länge 1, also ist nicht klar, was Sie damit machen wollen.

Dies ist das beste, das ich mit nach Ihren persönlichen Code einfiel: enter image description here

Betrachten Lesen a textbook on R ersten und the ggplot2 textbook:

#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") 

Der Ausgang davon.

+0

Delete, Danke, dass du versucht hast zu helfen. Die Ausgabe, die du erzeugt hast, ist die, die ich gerade habe, wie ich in meinem Beitrag referenziert habe. Diese Ausgabe gilt jedoch nur für die ersten beiden Spalten der Daten. Wie kann ich ein anderes Balkenrecht erstellen, das die Daten der nächsten zwei Spalten der Daten verwendet? Ich habe auch meine Daten neu formatiert und ersetzte es auf meinem editierten Post. Danke –