Ich habe einen ggplot-Befehl
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
innerhalb einer Funktion. Ich möchte jedoch einen Parameter der Funktion verwenden können, um die Spalte auszuwählen, die als Farbe und Gruppe verwendet werden soll. Dh ich möchte so etwas
f <- function( column ) {
...
ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}
Damit wird die im ggplot verwendete Spalte durch den Parameter bestimmt. ZB für f ("majr") erhalten wir die Wirkung von
ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )
aber für f ("Geschlecht") erhalten wir die Wirkung von
ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )
Einige Dinge, die ich versucht habe:
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )
funktioniert nicht. Noch tat
e <- environment()
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )
aes_string(x = rates.by.groups$name...
und es auch nicht müssen, da Sie dasggplot(data = rates.by.groups...
Argument bereits bestanden haben . (Das Problem in dieser Frage )"column_name"
oder"column"
würde nicht funktionierenAus den Versionshinweisen von
ggplot2 V3.0.0
:Die idiomatische Möglichkeit wäre nun, die in der Variablen enthaltene Zeichenfolge mit
sym()
(die fast mit den Basisaliasenas.name()
/ identisch ist) in ein Symbol zu konvertierenas.symbol()
und sie mit zu entfernen!!
Wir können die Daten von OP simulieren:
Wenn wir der Funktion lieber Rohnamen geben möchten, können wir Folgendes tun:
Es funktioniert mit Namen oder Symbolen UND mit String-Literalen
Wie Lionel sagt über
ensym()
:Ein Hinweis zu
enquo()
enquo()
zitiert den Ausdruck (nicht unbedingt ein Symbol), der dem Argument zugeführt wird. Es konvertiert kein Zeichenfolgenliteral in ein Symbol, soensym()
dass es hier möglicherweise weniger angepasst ist, aber wir können Folgendes tun:quelle
aes()
selbst spricht darüber,enquo()
aber es funktioniert nicht. Und wer hat schon mal davon gehörtensym()
? BIG SIGHf2
Alle vier Beispiele funktionieren, ebenso wie das Erfassen des Spaltennamens in einer Variablen (dhaname <- "mjr"; f2(aname)
). Wenn ich Code hinzufüge, um den Datenrahmen damit zu bearbeiten,dplyr
wird versucht, eine Spalte unter Verwendung des Variablennamens und nicht der Zeichenfolge im Variablennamen zu finden. Mit anderen Worten, wie komme ichrates.by.groups %>% group_by(!!column)...
zur Arbeit und unterstütze trotzdem die drei Arten des Anrufensf2
?ensym
gilt auch für das Erfassen des Spaltennamens in einer Variablen": Es schlägt nicht fehl, gibt jedoch nicht das gleiche Ergebnis zurück. Es wurde entwickelt, um als Namen bereitgestellte Argumente zu verarbeiten und Anführungszeichen zu tolerieren. Ich glaube, Sie möchten das Argument als Namen behandeln und auf den Wert zurückgreifen, wenn der Name nicht gefunden wird. Dies ist eigentlich das, was passiertselect
, aber nicht mitgroup_by
... Es ist möglich, es zu umgehen, aber nicht offensichtlich. Wenn es Ihnen wichtig ist, denke ich, hätte es eine eigene Frage verdient.select
undgroup_by
das war wahrscheinlich das Problem. Ich kann eine neue Frage erstellen, muss jedoch ein einfaches Beispiel erstellen und prüfen, ob es beantwortet wurde. Ich kann es posten, wenn nicht.facet_grid
? Es funktioniert mitfacet_grid(cols = vars(!!column))
, wirft aber einen Fehler mitfacet_grid(~ !!column)
Versuchen Sie es mit
aes_string
anstelle vonaes
.quelle
Eine andere Option (
ggplot2 > 3.0.0
) besteht darin, das ordentliche Bewertungspronomen zu verwenden.data
, um die ausgewählte Variable / Spalte aus demrates.by.groups
Datenrahmen zu entfernen.Erstellt am 04.04.2019 durch das reprex-Paket (v0.2.1.9000)
quelle
Die Verwendung
aes_string
behebt dieses Problem, tritt jedoch beim Hinzufügen von Fehlerbalken aufgeom_errorbar
. Unten finden Sie eine einfache Lösung.Bonus, Sie können Ihrem Plot auch Facetten hinzufügen, indem Sie diese Linien im ggplot verwenden:
Dieses Skript wurde von diesem ursprünglichen Beitrag geändert: ggplot2 - Fehlerbalken mit einer benutzerdefinierten Funktion
quelle
Hier ist ein extrem einfaches Beispiel.
Mach einfach zwei Dinge
!!
Sie hinzu, wenn Sie es verwendenquelle