2017-11-24 8 views
-7

Ich möchte ein Pixelraster mit den Werten einer Normalverteilung in es wie untenWie erstellt man eine Matrix mit einer Normalverteilung in r?

im Bild

enter image description here

Wer weiß, wie dies in R gefüllt zu tun haben?

+0

Wie die Logik, um die Werte zu berechnen sein sollte? Was hast du versucht, dein Ergebnis zu produzieren? Der Grafiktyp ist eine *** Heatmap ***. – jogo

Antwort

5

Es ist nicht klar, was Sie tun möchten. Fragen Sie, wie Sie aus einer bivariaten Normalverteilung abtasten können? Oder wie man eine Heatmap erstellt? Oder wie man Text auf einer Heatmap überlagert? Aber ok, ich beiße ...

Hier ist ein Beispiel von Grund auf, wie man Daten erzeugt und eine Heatmap mit Zahlen erzeugt, die Zählimpulse pro Behälterkasten anzeigen.

# Create sample data 
require(MASS); 
set.seed(2017); 
mu <- c(5, 5); 
sigma <- diag(c(2, 2)); 
df <- as.data.frame(mvrnorm(10000, mu = mu, Sigma = sigma)); 
colnames(df) <- c("x1", "x2"); 

# Bin breaks 
nbins <- 20; 
breaks_x <- seq(floor(min(df$x1)), ceiling(max(df$x1)), length.out = nbins); 
breaks_y <- seq(floor(min(df$x2)), ceiling(max(df$x2)), length.out = nbins); 

# Frequency table 
freq <- as.data.frame(table(
    as.numeric(cut(df$x1, breaks = breaks_x)), 
    as.numeric(cut(df$x2, breaks = breaks_y)))); 

# Plot matrix 
mat <- diag(nbins) * 0; 
mat[cbind(freq[, 1], freq[, 2])] <- freq[, 3]; 
image(breaks_x, breaks_y, mat, col= rainbow(10)); 
text(breaks_x[freq$Var1], breaks_y[freq$Var2], freq$Freq, cex = 0.8); 

enter image description here

Oder wenn Sie in einer Heatmap nur daran interessiert sind, können Sie ggplot2 mit stat_bin2d verwenden.

require(ggplot2); 
ggplot(data.frame(df), aes(x1, x2)) + stat_bin2d(bins = 20) + scale_fill_gradientn(colours = rainbow(32)); 

enter image description here

Oder gplots::hist2d.

Siehe here Weitere Optionen ...

+0

Vielen Dank! Es könnte ein bisschen einfacher sein, da ich nicht jede Zeile Ihres Codes verstehe ... :-) – Robert

+0

@Robert Gern geschehen. Wie Sie bemerkt haben, hat Ihre Frage eine ganze Reihe von negativen Bewertungen bekommen. Das liegt daran, dass SO kein Forum ist, in dem Sie andere bitten, den Code für Sie zu schreiben. noch ist dies ein Forum, um dich zu unterrichten R. Fragen wie deine sind normalerweise verpönt. Stattdessen sind SO-Mitglieder mehr als glücklich, beim Debuggen/Verbessern von Code zu helfen **, nachdem Sie selbst eine beträchtliche und sichtbare Menge an Nachforschungen gemacht haben **. Als Ratschlag für die Zukunft sollten Sie [die SO-Tour] (https://Stackoverflow.com/tour) besuchen und erfahren, [wie Sie Fragen stellen können] (https://stackoverflow.com/help/how- Fragen)). –

+0

Verstanden. Aber da ich den Code nicht verstehe, möchte ich es selbst ausprobieren. – Robert

Verwandte Themen