2016-05-14 12 views
1

Ich habe derzeit ein Streudiagramm nur eine Spalte aus meinem Datensatz, die ich von einem CSV lesen. Ich möchte ATI und BTI zeichnen.Shiny R: Zeichnen Sie eine andere Spalte von Daten auf Streudiagramm mit ggplot2

PP BTI  ATI 
1 9710 9660 
2 10000 9900 
3 10300 10100 
4 10600 10400 
. 
. 
. 
99 159000 107000 

Mein Code sieht wie folgt aus:

#server.R 

#Income Percentile Scatterplot 
incomedata <- read.csv("/Users/mathewsayer/Documents/Work/Level 7/Shiny Flat Tax/Flat Tax App/data/incomedist.csv") 

ranges <- reactiveValues(x = NULL, y = NULL) 

output$plot1 <- renderPlot({ 
    ggplot(incomedata, aes(x = BTI, y = PP)) + 
    geom_point() + 
    coord_cartesian(xlim = ranges$x, ylim = ranges$y) 
}) 

#Brush and zoom on scatterplot 
observeEvent(input$plot1_dblclick, { 
    brush <- input$plot1_brush 
    if (!is.null(brush)) { 
    ranges$x <- c(brush$xmin, brush$xmax) 
    ranges$y <- c(brush$ymin, brush$ymax) 
    } 
    else { 
    ranges$x <- NULL 
    ranges$y <- NULL 
    } 
}) 

Ich habe versucht, ATI wie diese hinzu: aes(x = BTI:ATI, y = PP) aber ich erhalte die Fehlermeldung Aesthetics must be either length 1 or the same as the data (99): x, y

Würde ich besser meine Daten als ein Aufruf Rahmen oder Tisch? Jede Hilfe würde sehr geschätzt werden.

EDIT: Die schwarzen Plot Punkte sind BTI, ich möchte die Daten von ATI ähnlich zu diesem Foto-Mock-up Ich gerade getan habe. example of how it should look when done

Antwort

1

Ich bin nicht sicher, warum Sie die Perzentile auf der y-Achse sein wollen, aber hier ist der Code, der tut, was Sie wollen:

library(dplyr) 
library(shiny) 
library(tidyr) 
library(ggplot2) 

# simulate some data 
df_foo = data_frame(
    percentile = seq.int(99), 
    ATI = sort(rnorm(99)), 
    BTI = sort(rnorm(99)) 
) 

# UI 
ui_foo = shinyUI(
    plotOutput("plot_foo") 
) 

# server 
server_foo = shinyServer(function(input, output) { 
    output$plot_foo = renderPlot({ 
    df_foo %>% 
    gather(key = var_name, value = value, -percentile) %>% 
    ggplot(aes(x = value, y = percentile, group = var_name, color = var_name)) + 
    geom_line() + 
    theme_bw() 
    }) 
}) 

# run the server 
shinyApp(ui = ui_foo, server = server_foo) 

Ihre Frage ist im Grunde darüber, wie plotten mehrere Variablen in ggplot2 und Sie müssen grundsätzlich die group Ästhetik in geeignet neu gestalteten Daten angeben.

+0

Mein Argument hinter dem Perzentil auf der y-Achse ist, dass die Benutzer ihr Einkommen kennen, aber nicht, welches Perzentil sie ' Re in. Deshalb haben sie zuerst über die x-Achse gelesen, um ihren Platz dort zu finden, bevor sie nach oben schauen, um zu sehen, welches Perzentil. Natürlich meine [zweite Frage] (https://stackoverflow.com/questions/37226473/shiny-r-plotting-outputs-onto-a-scatterplot-alongside-existing-data-from-a-csv) welche ich Ich werde mich gerade auf den Weg machen, um das halb-redundant zu machen. – gizzard

0

Um sowohl BTI und ATI zu zeichnen, müssen Sie festlegen, welche auf der Achse aufgetragen ist. Mit anderen Worten, Sie sollten ggplot mitteilen, dass beide Spalten geplottet werden sollen, dies fehlt in Ihrem Code, d. H. In ggplot(incomedata, aes(x = BTI, y = PP)). In diesem Code werden BTI auf der x-Achse und PP auf der y-Achse aufgetragen, und soweit ich weiß, wollen Sie nicht, dass PP überhaupt geplottet wird.

Können Sie bitte den folgenden Code ausprobieren und sehen, ob er das tut, was Sie erwarten?

ggplot(incomedata, aes(x = BTI, y = ATI)) + 
    geom_point() + 
    coord_cartesian(xlim = ranges$x, ylim = ranges$y) 
+0

Vielen Dank für Ihre Antwort. Im Rückblick scheint es, dass ich die x-Achse als etwas wie "Einkommen" haben muss. PP ist wichtig auf der y-Achse. Mein aktueller Code zeigt BTI so an, wie es sein sollte. Ich habe oben ein Bild hinzugefügt, das verdeutlichen sollte, was ich mit ATI anstrebe. – gizzard

+1

Sie können Ihre Daten einfach vom langen Format in das breite Format umformen, dann haben Sie alle Ihre ATI- und BTI-Werte in einer Spalte zusammengefasst und eine weitere neue Spalte definiert, zu welcher 'Kategorie' jeder Wert gehört (zu ATI oder BTI). Dann können Sie von dort aus die Spalte "Werte" auf der X-Achse und die PP-Werte auf der Y-Achse grafisch darstellen und dann das Attribut "color = Category" hinzufügen, so dass die Werte basierend auf der zugehörigen Kategorie (ATI oder BTI) farbig sind zu. Siehe hierzu: http: // stackoverflow.com/questions/33101923/plot-line-graph-zweispalten-auf-x-achse-in-r –

0

Danke für Ihre Hilfe bert und tchakravarty.

Ich formte meine Daten in langes Format und es funktionierte perfekt.

Also, was ich tat, war:

  • meine Daten in langen Format umformen als @Bert mit einer neuen Spalte Kategorie vorgeschlagen

  • Changed my ggplot() dazu:

output$plot1 <- renderPlot({ ggplot(incomedata, aes(x = Income, y = PP)) + geom_point(aes(colour=Category, group=Category)) + coord_cartesian(xlim = ranges$x, ylim = ranges$y) })

Verwandte Themen