2017-09-20 1 views
0

Ich bin auf einige Daten auf Partei Polarisation arbeiten (something like this) und verwendet geom_dumbbell von ggalt und ggplot2. Ich bekomme immer die gleichen aes Fehler und andere Lösungen im Forum hat dies nicht so effektiv adressiert. Dies sind meine Beispieldaten.Ästhetik müssen entweder 1 oder Länge die gleichen wie die Daten (1) sein: x, y, Etikett

df <- data_frame(policy=c("Not enough restrictions on gun ownership", "Climate change is an immediate threat", "Abortion should be illegal"), 
      Democrats=c(0.54, 0.82, 0.30), 
      Republicans=c(0.23, 0.38, 0.40), 
      diff=sprintf("+%d", as.integer((Democrats-Republicans)*100))) 

wollte ich, um die Handlung zu halten, so umgewandelt Politik factor und wollte% nur in der ersten Zeile angezeigt werden.

df <- arrange(df, desc(diff)) 
    df$policy <- factor(df$policy, levels=rev(df$policy)) 

    percent_first <- function(x) { 
    x <- sprintf("%d%%", round(x*100)) 
    x[2:length(x)] <- sub("%$", "", x[2:length(x)]) 
    x 
    } 

Dann habe ich ggplot verwendet, das etwas nahe an das gemacht hat, was ich wollte.

gg2 <- ggplot() 
    gg2 <- gg + geom_segment(data = df, aes(y=country, yend=country, x=0, xend=1), color = "#b2b2b2", size = 0.15) 

    # making the dumbbell 
    gg2 <- gg + geom_dumbbell(data=df, aes(y=country, x=Democrats, xend=Republicans), 
        size=1.5, color = "#B2B2B2", point.size.l=3, point.size.r=3, 
        point.color.l = "#9FB059", point.color.r = "#EDAE52") 

Ich wollte dann den Hantel Democrat und Republican oben lesen, die die beiden Punkte (like this) zu beschriften. Hier bekomme ich den Fehler.

gg2 <- gg + geom_text(data=filter(df, country=="Government will not control gun violence"), 
        aes(x=Democrats, y=country, label="Democrats"), 
        color="#9fb059", size=3, vjust=-2, fontface="bold", family="Calibri") 
    gg2 <- gg + geom_text(data=filter(df, country=="Government will not control gun violence"), 
       aes(x=Republicans, y=country, label="Republicans"), 
       color="#edae52", size=3, vjust=-2, fontface="bold", family="Calibri") 

Irgendwelche Gedanken auf, was ich tun könnte falsch?

+2

wo kommt 'country' kommen aus? – Nate

+2

Versuchen Sie, 'gg' oder' gg2' zu referenzieren ?! – bouncyball

+0

'Aes' Aufruf akzeptiert Variablen definiert in' data', 'label =" Republicans "' ist keine Variable, sondern eine konstante Zeichenfolge daher der Fehler – missuse

Antwort

0

Ich denke, es wäre einfacher, Ihre eigenen "Hanteln" mit geom_segment() und geom_point() zu bauen. In Zusammenarbeit mit Ihrem df und Ändern der variablen refences „Land“ auf „Politik“:

library(tidyverse) 

# gather data into long form to make ggplot happy 
df2 <- gather(df,"party", "value", Democrats:Republicans) 

ggplot(data = df2, aes(y = policy, x = value, color = party)) + 
    # our dumbell 
    geom_path(aes(group = policy), color = "#b2b2b2", size = 2) + 
    geom_point(size = 7, show.legend = FALSE) + 
    # the text labels 
    geom_text(aes(label = party), vjust = -1.5) + # use vjust to shift text up to no overlap 
    scale_color_manual(values = c("Democrats" = "blue", "Republicans" = "red")) + # named vector to map colors to values in df2 
    scale_x_continuous(limits = c(0,1), labels = scales::percent) # use library(scales) nice math instead of pasting 

Erzeugt dieses Grundstück:

enter image description here , die einige überschneidende Beschriftungen hat. Ich denke, man könnte vermeiden, dass, wenn Sie nur den ersten Buchstaben der Partei verwenden wie folgt aus:

ggplot(data = df2, aes(y = policy, x = value, color = party)) + 
    geom_path(aes(group = policy), color = "#b2b2b2", size = 2) + 
    geom_point(size = 7, show.legend = FALSE) + 
    geom_text(aes(label = gsub("^(\\D).*", "\\1", party)), vjust = -1.5) + # just the first letter instead 
    scale_color_manual(values = c("Democrats" = "blue", "Republicans" = "red"), 
         guide = "none") + 
    scale_x_continuous(limits = c(0,1), labels = scales::percent) 

Nur mit Namen der Top-Thema beschriften:

ggplot(data = df2, aes(y = policy, x = value, color = party)) + 
    geom_path(aes(group = policy), color = "#b2b2b2", size = 2) + 
    geom_point(size = 7, show.legend = FALSE) + 
    geom_text(data = filter(df2, policy == "Not enough restrictions on gun ownership"), 
        aes(label = party), vjust = -1.5) + 
    scale_color_manual(values = c("Democrats" = "blue", "Republicans" = "red")) + 
    scale_x_continuous(limits = c(0,1), labels = scales::percent) 
+0

Das funktioniert, danke. Mein ursprüngliches Denken war nur mit Etiketten auf der Oberseite für die erste Reihe und ließ Farbcodes den Rest erledigen. – sdiya

+0

Sicher, wenn Sie nur die erste Zeile beschriften möchten, haben Sie ein paar Optionen, ich werde eins zur Antwort hinzufügen – Nate

Verwandte Themen