2 Zeilen als xy-Darstellung

Wie erstelle ich Grafiken, was ist zu beachten?

Moderatoren: EDi, jogo

seyt
Beiträge: 6
Registriert: Mo Jul 13, 2020 8:49 am

2 Zeilen als xy-Darstellung

Beitrag von seyt »

Hallo zusammen,
als Anfänger in R mache ich sicher viele Bezeichnungsfehler, dafür bitte ich um Entschuldigung.

Ich versuche aus einer Excel-Datei die Windenergieerzeugung über die letzten Jahre herauszulesen und als Balkendiagramm oder Histogramm darzustellen. Auf der x-Achse stehen die Jahreszahlen, auf der y-Achse die erzeugte Energie.
Dazu habe ich das entsprechende excel-Sheet herausgelöst:

Code: Alles auswählen

anteil_altEnergie <- read_excel('../datensammlungen/energiedaten-gesamt-xls.xlsx',sheet=32)

Code: Alles auswählen

colnames(anteil_altEnergie)
 '...1''Stromerzeugungskapazitäten, Bruttostromerzeugung''...3''...4''...5''...6''...7''...8''...9''...10''...11''...12''...13''...14''...15''...16''...17''...18''...19''...20''...21''...22''...23''...24''...25''...26''...27''...28''...29''Energiedaten''...31'

Code: Alles auswählen

rownames(anteil_altEnergie)
'1''2''3''4''5''6''7''8''9''10''11''12''13''14''15''16''17''18''19''20''21''22''23''24''25''26''27''28''29''30''31''32''33''34''35''36''37''38''39''40''41''42''43''44''45''46''47''48''49''50''51''52''53''54''55''56''57'
Die Zeile mit den Jahreszahlen ist Zeile 6, die mit der erzeugten Energie Zeile 13. Die relevanten Werte stehen in den Spalten 3:29
Das Folgende funktioniert:

Code: Alles auswählen

xWert <- anteil_altEnergie[6,3:29]
yWert <- anteil_altEnergie[13,3:29]
xw <- as.numeric(xWert)
yw <- as.numeric(yWert)
plot(x=xw,y=yw,type='h',xlab='Jahr',ylab='erzeugte Energie',main='WINDENERGIE',col='green')
df_w <- data.frame(xw,yw)
p <- ggplot(df_w,aes(x=xw,y=yw),geom_col())
p <- p + geom_bar(stat="identity", color='skyblue',fill='steelblue')
p
Da mir das sehr selbstgestrickt erscheint, habe ich noch etwas anderes versucht:

Code: Alles auswählen

xk <- anteil_altEnergie[c(6),3:29]
yk <- anteil_altEnergie[c(13),3:29]
ggplot(anteil_altEnergie[c(6,13),3:29],aes(x=xk,y=yk),geom_point())
Da erhalte ich als Fehlermeldung:
ERROR while rich displaying an object: Error: Aesthetics must be either length 1 or the same as the data (2): x and y

Ich interpretiere das so, dass ggplot versucht ein Diagramm aus Zeilen und Spalten zu erzeugen und die 2-Zeilendarstellung nicht akzeptiert.

Wie sieht ein Code aus, der meine Absicht umsetzt, aber fachlich richtig ist?

Viele Grüße
seyt
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: 2 Zeilen als xy-Darstellung

Beitrag von bigben »

In Deinem nicht funktionierenden Code fällt ein Komma anstelle des Plus vor dem geom_point auf. Löst das vielleicht das Problem schon?
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
seyt
Beiträge: 6
Registriert: Mo Jul 13, 2020 8:49 am

Re: 2 Zeilen als xy-Darstellung

Beitrag von seyt »

Code: Alles auswählen

ggplot(anteil_altEnergie[c(6,13),3:29],aes(x=xk,y=yk)+geom_point())
Nein, das löst das Problem nicht. Allerdings erhalte ich eine andere Fehlermeldung:

Error: Mapping should be created with `aes()` or `aes_()`.
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: 2 Zeilen als xy-Darstellung

Beitrag von bigben »

Ok, vorhin am Handy habe ich das Ausmaß der Probleme unterschätzt. Da steckt immer noch ein Klammerfehler drin: Derzeit wird ein aes mit einem geom_ addiert und das passt ihm nicht und das wird wahrscheinlich die Fehlermeldung erklären. Das größere Problem ist aber, dass xw und yw nur im dataframe df_w definiert sind, den Du jetzt aber nicht mehr benutzt.

Was passiert denn mit

Code: Alles auswählen

ggplot(df_w, aes(x = xk, y = yk) + geom_point()
Wenn das das Problem nicht löst, solltest Du ein funktionierendes Minimalbeispiel einschließlich einiger Daten zu Spielen einstellen. Anleitung dazu steht im FAQ Forum.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
seyt
Beiträge: 6
Registriert: Mo Jul 13, 2020 8:49 am

Re: 2 Zeilen als xy-Darstellung

Beitrag von seyt »

Ich habe deinen Code-Vorschlag eingegeben, erhalte aber eine Fehlermeldung:

Code: Alles auswählen

ggplot(df_w, aes(x = xk, y = yk) + geom_point()
Error in parse(text = x, srcfile = src): <text>:3:0: unerwartetes Ende der Eingabe
1: ggplot(df_w, aes(x = xk, y = yk) + geom_point()
2:        
  ^
Traceback:
Dann habe ich die fehlende Klammer ergänzt:

Code: Alles auswählen

ggplot(df_w, aes(x = xk, y = yk) + geom_point())
Error: Mapping should be created with `aes()` or `aes_()`.
Traceback:

1. ggplot(df_w, aes(x = xk, y = yk) + geom_point())
2. ggplot.default(df_w, aes(x = xk, y = yk) + geom_point())
3. abort("Mapping should be created with `aes()` or `aes_()`.")
4. signal_abort(cnd)
Auch eine andere Version bringt mich nicht weiter:

Code: Alles auswählen

ggplot(df_w, aes(x = xk, y = yk)) + geom_point()
ERROR while rich displaying an object: Error in is.finite(x): nicht implementierte Standardmethode für Typ 'list'
Wenn das das Problem nicht löst, solltest Du ein funktionierendes Minimalbeispiel einschließlich einiger Daten zu Spielen einstellen. Anleitung dazu steht im FAQ Forum.
Ich habe mir die FAQ angesehen: http://www.forum.r-statistik.de/app.php/help/faq
Eine Anleitung habe ich nicht gefunden oder sie übersehen.

Ich werde mich jetzt noch mal eingehender mit ggplot befassen und mich dann eventuell erneut melden. Bis hierher schon mal vielen Dank!

seyt
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: 2 Zeilen als xy-Darstellung

Beitrag von bigben »

Hallo seyt,

mit FAQ Forum meinte ich das hier: viewforum.php?f=20

Mit der Anleitung zum Erstellen von Code und Datenbeispielen das hier: viewtopic.php?f=20&t=11

Erst mal zu Begriffsklärung ist das hier sehr gut: https://stackoverflow.com/help/minimal- ... le-example

Mein Klammerfehler zeigt mal wieder, dass ich nicht irgendwas ins Blaue hätte schreiben, sondern vor der Veröffentlichung mit Deinem Beispiel hätte gegenchecken sollen.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
seyt
Beiträge: 6
Registriert: Mo Jul 13, 2020 8:49 am

Re: 2 Zeilen als xy-Darstellung

Beitrag von seyt »

Hallo zusammen,

ich schicke mal die Daten mit, mit denen ich arbeite. Es war ursprünglich eine umfangreiche Datensammlung in Excel, aus der ich das Sheet 32 extrahiert habe. In diesem Sheet interessieren mich die Zeilen 6 (Jahreszahlen) und 13 (erzeugte Windenergie). Ich versuche ein Diagramm mit der x-Achse Jahreszahlen und der y-Achse erzeugte Windenergie zu bekommen und zwar mit ggplot. Das ist mit bisher nicht gelungen.

Ich wollte die Daten als rds-Datei anhängen, die wird mir aber bei 'Dateien hinzufügen' nicht angezeigt. Also speichere ich das df 'anteil_altEnergie' als csv-Datei. Ob ich das richtig mache, wird sich zeigen. Wie gesagt -> Anfänger ;-)

Viele Grüße

seyt
Dateianhänge
anteil_altEnergie.csv
(10.48 KiB) 58-mal heruntergeladen
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: 2 Zeilen als xy-Darstellung

Beitrag von bigben »

Schau mal, ob Dir das hier weiterhilft, sonst gerne nochmal fragen:

Code: Alles auswählen

altEnergie <- read.csv("http://forum.r-statistik.de/download/file.php?id=1062")
str(altEnergie)

# Auslesen und Formatanpassung der Zeilen
df_w <- data.frame( xw = as.numeric(altEnergie[6,3:29]),
                    yw = as.numeric(altEnergie[13,3:29]))


library(ggplot2)

p1 <- ggplot(df_w,aes(x=xw,y=yw)) + geom_col(color='skyblue',fill='steelblue') +
  xlab("Jahr") + ylab("erzeugte Energie")
print(p1)

p2 <- ggplot(df_w,aes(x=xw,y=yw)) + 
  geom_point(color='steelblue') +
  geom_line(color = "steelblue", lwd=1) +
  geom_area(fill="steelblue", alpha =.3) +
  xlab("Jahr") + ylab("erzeugte Energie") + 
  theme_minimal()
print(p2)

p3 <- ggplot(df_w,aes(x=xw,y=yw)) + 
  geom_step(color = "steelblue", lwd=2) +
  xlab("Jahr") + ylab("erzeugte Energie") + 
  theme_light()
print(p3)
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
seyt
Beiträge: 6
Registriert: Mo Jul 13, 2020 8:49 am

Re: 2 Zeilen als xy-Darstellung

Beitrag von seyt »

Hallo Bernhard,

vielen Dank für deine Codebeispiele. Sie funktionieren prima und liefern schöne Ergebnisse. Wenn du meine Beispiele ansiehst, habe ich in ähnliche Richtung gedacht.

Was mich stört, sind die Umwandlungen, die vor der eigentlichen Nutzung der Daten stattfinden müssen.
# Auslesen und Formatanpassung der Zeilen
df_w <- data.frame( xw = as.numeric(altEnergie[6,3:29]),
yw = as.numeric(altEnergie[13,3:29]))
altEnergie ist doch schon ein dataframe, warum kann es nicht direkt genutzt werden?
ggplot(altEnergie,aes(x=Zeile_6,y=Zeile_13))
p <- p + geom_histogram()
print(p)
Kann es sein, dass eventuell die t-Funktion weiterhilft, dass Zeilen und Spalten vertauscht werden. Funktionieren würde Folgendes:
neuEnergie <- data.frame(t(altEnergie))
Allerdings bin ich auch damit bei der Grafikausgabe nicht weitergekommen.

seyt
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: 2 Zeilen als xy-Darstellung

Beitrag von bigben »

Hallo seyt,
seyt hat geschrieben: Do Jul 16, 2020 3:19 pmaltEnergie ist doch schon ein dataframe, warum kann es nicht direkt genutzt werden?
Was wäre denn der Vorteil, es direkt zu verwenden? Ein Statistikprogramm ist keine Tabellenkalkulation. In Tabellenkalkulationen entscheidet der User für jede Zelle neu, was sie bedeuten soll. In Statistikprogrammen stehen Messgrößen in Spalten und Beobachtungen in Zeilen. Nicht anders.

Wenn Du Dir mal Deinen Ausschnitt aus altEnergie anschaust:

Code: Alles auswählen

altEnergie <- read.csv("http://forum.r-statistik.de/download/file.php?id=1062")
str(altEnergie[6, 3:29])
dann siehst Du sofort, dass das ein kleiner data.frame ist, kein Vektor. Die Daten stehen immer noch falsch in einer Reihe statt in einer Spalte. Da macht ggplot2 gar nichts mit.

Die Funktion as.numeric wandelt diesen Dataframe in ein array:

Code: Alles auswählen

str(as.numeric(altEnergie[6, 3:29]))
und das ist einem Vektor nahe genug, dass man daraus einen neuen data.frame schaffen kann, der dann die Messreihen in Spalten enthält, wie es sich für ein Statistikprogramm gehört.

Code: Alles auswählen

ggplot(altEnergie,aes(x=Zeile_6,y=Zeile_13))
p <- p + geom_histogram()
print(p)
Wenn ggplot2 Excel wäre, dann könnte man irgendwo "Daten auswählen" und dann "Zeile/Spalte tauschen" anklicken. Ist es aber nicht.


Kann es sein, dass eventuell die t-Funktion weiterhilft, dass Zeilen und Spalten vertauscht werden.
Generell keine gute Idee. Deine Ausgangsdaten wurden in einem Tabellenkalkulationsprogramm eingegeben. Dort steht jede Zelle für sich und deshalb hat es bei der Erstellung niemanden gestört, dass teilweise in einer Zeile sowohl Text als auch Messdaten vorkommen. Siehe z. B.:

Code: Alles auswählen

> altEnergie[13,2]
[1] "Wind 1)"
Wenn Du jetzt mit t() Zeilen und Spalten vertauschen würdest, stünde ganz oben in der neuen Spalte 13 der Text "Wind 1)". Und weil eine Spalte in einem Statistikprogramm immer den gleichen Datentyp enthält, müsste die ganze Spalte vom Typ "Text" sein, sodass man mit den Werten nicht mehr rechnen könnte.

Es scheint regelhaft zu Verwirrungen zu führen, wenn Leute R als Fortsetzung von Excel mit anderen Mitteln sehen. Das ist es nicht. Die Vorstellungen beider Programme dazu, wie Daten auszusehen haben sind sehr unterschiedlich und deshalb kann man oft Excel-Tabellen nicht einfach als Wertetabellen für R (oder SPSS, oder ...) verwenden. Es ist nichts falsch daran, die Werte aus dem Excel-Sheet gezielt herauszulesen und in einer für R brauchbaren Form gesondert zu speichern und zu verarbeiten.
Vielleicht hast Du ja Interesse, Dir meine Klage im Eingangspost zu diesem Thread durchzulesen: viewtopic.php?f=24&t=1277

HTH,
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten