2017-10-05 2 views
0
age <- rnorm(100, 0:100) 
freq <- rnorm(100, 0:1) 
char1<-stringi::stri_rand_strings(100, length = 1, pattern = "[abc]") 
char2<-stringi::stri_rand_strings(100, length = 1, pattern = "[def]") 
char3<-stringi::stri_rand_strings(100, length = 1, pattern = "[def]") 
char3<-stringi::stri_rand_strings(100, length = 1, pattern = "[ghi]") 
dftest <- data.frame(age, freq, char1, char2, char3) 
dflist <- list(dftest, dftest, dftest, dftest, dftest) 

Dies erstellt einen Beispieldatenrahmen, der das Problem, das ich habe, zeigt.Wie würde man Streudiagramme basierend auf Eigenschaften in mehreren Spalten eines Datenrahmens erstellen?

Ich möchte Scatterplots für Alter vs Freq für jeden der Datenrahmen in dieser Liste erstellen, aber ich möchte eine andere Farbe für die Punkte basierend auf dem Wert in den Spalten "char #". Ich brauche auch eine separate Trendlinie für Werte in jedem dieser separaten Merkmale.

Ich möchte dies auch basierend auf Kombinationen von verschiedenen Eigenschaften aus verschiedenen Char-Spalten tun können. Ein Beispiel dafür ist 3 * 3 = 9 separate Farben für jede der Kombinationen, jede mit einer anderen Trendlinie.

Wie würde dies geschehen?

Ich hoffe, das war reproduzierbar und klar genug. Ich habe nur ein paar Mal gepostet, also gewöhne ich mich immer noch an das Format.

Danke!

+0

In den von Ihnen angegebenen Daten, die Liste der Datenrahmen sind alle identisch, so dass selbst wenn man sich anders gefärbt , Sie würden nur eine Reihe von Punkten sehen. Angenommen, Sie haben echte Daten, die anders aussehen als diese, dann möchten Sie zunächst jedem Datenrahmen eine ID-Spalte hinzufügen, dann alle zusammen "verknüpfen" und dann die Farbe zu "ID" zuordnen. Für Ihr Beispiel wäre Ihre ID 1-5 – Mako212

+0

Werfen Sie einen Blick auf ggplot2. Klingt optimal für dieses Problem. Versuchen Sie Facetten zu verwenden. – Jimbou

Antwort

0

Beginnen wir damit, einen Datenrahmen zu schaffen, die uns Punkte mit verschiedenen Farben zeigen können:

df2 <- data.frame(age=rnorm(200,0:100), 
    freq=rnorm(200,0:1),id=rep(1:2,each=100)) 

Dann können wir plot wie so:

plot(dflist2$age,dflist2$freq, col=dflist2$id, pch=16) 

Wir setzen col (Farbe) gleich zu id (dies würde jeden Datenrahmen darstellen). pch ist der Punkttyp (durchgezogene Punkte).

0

Sie können dplyr für die Datenvorbereitung und ggplot für das Plotten versuchen. Alle Funktionen werden über das tidyverse Paket geladen:

library(tidyverse) 
# age vs freq plus trendline for char1 
as.tbl(dftest) %>% 
    ggplot(aes(age, freq, color=char1)) + 
    geom_point() + 
    geom_smooth(method = "lm") 

enter image description here

# age vs freq plus trendline for combinations of char columns 
as.tbl(dftest) %>% 
    unite(combi, char1, char2, char3, sep="-") %>% 
    ggplot(aes(age, freq, color=combi)) + 
    geom_point() + 
    geom_smooth(method = "lm") 
# no plot as too many combinations make the plot to busy 
dflist %>% 
    bind_rows(.id = "df_source") %>% 
    ggplot(aes(age, freq, color=char1)) + 
    geom_point() + 
    geom_smooth(method = "lm", se=FALSE) + 
    facet_wrap(~df_source) 

enter image description here

+0

Tut mir leid, ich hätte das wahrscheinlich in der Frage erwähnt, aber ist es möglich, den Spearman-Korrelations-p-Wert und rho jedes der linearen Modelle in der Grafik selbst anzuzeigen? – user8384020

+0

Ja, das ist möglich. Sehen Sie sich die Pakete 'ggpubr' oder' ggsignify' an. Beachten Sie, dass 'lm' eine parametrische Methode ist. – Jimbou

Verwandte Themen