ggplot2 Protokolltransformation für Daten und Skalen
Dies ist eine Fortsetzung meiner vorherigen FrageIntegration von ggplot2 mit benutzerdefinierter stat_function (), das habe ich mir gestern geantwortet. Meine jetzigeProble ist das, im folgenden reproduzierbaren Beispiel, Linien, die @ zeichnen soll components der Datenwerte 'mixture Distribution, erscheinen weder an den erwarteten Stellen, noch haben sie die erwartete Form, wie unten gezeigt (siehe die roten Linien bei y = 0 in der zweiten Abbildung).
Komplettreproducible example:
library(ggplot2)
library(scales)
library(RColorBrewer)
library(mixtools)
NUM_COMPONENTS <- 2
set.seed(12345) # for reproducibility
data(diamonds, package='ggplot2') # use built-in data
myData <- diamonds$price
# extract 'k' components from mixed distribution 'data'
mix.info <- normalmixEM(myData, k = NUM_COMPONENTS,
maxit = 100, epsilon = 0.01)
summary(mix.info)
numComponents <- length(mix.info$sigma)
message("Extracted number of component distributions: ",
numComponents)
calc.components <- function(x, mix, comp.number) {
mix$lambda[comp.number] *
dnorm(x, mean = mix$mu[comp.number], sd = mix$sigma[comp.number])
}
g <- ggplot(data.frame(x = myData)) +
scale_fill_continuous("Count", low="#56B1F7", high="#132B43") +
scale_x_log10("Diamond Price [log10]",
breaks = trans_breaks("log10", function(x) 10^x),
labels = prettyNum) +
scale_y_continuous("Count") +
geom_histogram(aes(x = myData, fill = 0.01 * ..density..),
binwidth = 0.01)
print(g)
# we could select needed number of colors randomly:
#DISTRIB_COLORS <- sample(colors(), numComponents)
# or, better, use a palette with more color differentiation:
DISTRIB_COLORS <- brewer.pal(numComponents, "Set1")
distComps <- lapply(seq(numComponents), function(i)
stat_function(fun = calc.components,
arg = list(mix = mix.info, comp.number = i),
geom = "line", # use alpha=.5 for "polygon"
size = 1,
color = "red")) # DISTRIB_COLORS[i]
print(g + distComps)
AKTUALISIERE: Nur eine kurze Anmerkung zu meinen Bemühungen. Ich habe zusätzlich verschiedene andere Optionen ausprobiert, einschließlich der Konvertierung der X-Achsenskala des Diagramms innorma und Anfordern der ursprünglichen Datenwerte 'log transformation im Histogrammteil wie folgt:geom_histogram(aes(x = log10(data), fill = ..count..), binwidth = 0.01)
, aber das Endergebnis bleibt gleich. In Bezug auf meinen ersten Kommentar habe ich festgestellt, dass die erwähnte Transformation nicht erforderlich ist, solange ich auf das Objekt ..count .. verweise.
UPDATE 2: Geänderte Linienfarbe, produziert vonstat_function()
, zu rot, um das Problem zu klären.