Estoy usando R y tengo dos marcos de datos: zanahorias y pepinos. Cada marco de datos tiene una sola columna numérica que enumera la longitud de todas las zanahorias medidas (total: 100k zanahorias) y pepinos (total: 50k pepinos).
Deseo trazar dos histogramas, la longitud de la zanahoria y la longitud del pepino, en la misma parcela. Se superponen, así que supongo que también necesito algo de transparencia. También necesito usar frecuencias relativas, no números absolutos, ya que el número de instancias en cada grupo es diferente.
algo así sería bueno, pero no entiendo cómo crearlo desde mis dos tablas:
Respuestas:
Esa imagen que vinculaste fue para curvas de densidad, no para histogramas.
Si has estado leyendo en ggplot, entonces quizás lo único que te falta es combinar tus dos marcos de datos en uno largo.
Entonces, comencemos con algo como lo que tiene, dos conjuntos de datos separados y combínelos.
Después de eso, lo cual es innecesario si sus datos ya están en formato largo, solo necesita una línea para hacer su trazado.
Ahora, si realmente quería histogramas, lo siguiente funcionará. Tenga en cuenta que debe cambiar la posición del argumento predeterminado de "pila". Puede perder eso si realmente no tiene una idea de cómo deberían ser sus datos. Un alfa más alto se ve mejor allí. También tenga en cuenta que lo hice histogramas de densidad. Es fácil quitarlo
y = ..density..
para volver a contar.fuente
ggplot(vegLengths, aes(length, fill = veg)) + geom_bar(pos="dodge")
. Esto hará histogramas entrelazados, como en MATLAB.Aquí hay una solución aún más simple que utiliza gráficos básicos y mezcla alfa (que no funciona en todos los dispositivos gráficos):
La clave es que los colores son semitransparentes.
Editar, más de dos años después : como esto acaba de recibir un voto positivo, creo que también podría agregar una imagen de lo que produce el código, ya que la combinación alfa es muy útil:
fuente
plot
comandos? Puede poner todas esas opciones en loshist
comandos y solo dos en las dos líneas.plot
comando directamente en el comando hist como dije. Publicar el código no es para lo que son los comentarios.Aquí hay una función que escribí que usa pseudo-transparencia para representar histogramas superpuestos
Aquí hay otra forma de hacerlo usando el soporte de R para colores transparentes
Los resultados terminan pareciéndose a esto:
fuente
postscript
)Ya hay respuestas hermosas, pero pensé en agregar esto. Me parece bien. (Copió números aleatorios de @Dirk).
library(scales)
es necesario`El resultado es...
Actualización: esta función superpuesta también puede ser útil para algunos.
Siento que el resultado
hist0
es más bonito de ver quehist
El resultado de
es
fuente
Aquí hay un ejemplo de cómo puede hacerlo en gráficos R "clásicos":
El único problema con esto es que se ve mucho mejor si los saltos de histograma están alineados, lo que puede tener que hacerse manualmente (en los argumentos pasados a
hist
).fuente
ggplot
) que explica directamente si sus dos histogramas tienen tamaños de muestra sustancialmente diferentes.breaks=seq(min(data$some_property), max(data$some_property), by=(max_prop - min_prop)/20)
Aquí está la versión como la ggplot2 que di solo en la base R. Copié algunas de @nullglob.
generar los datos
No necesita ponerlo en un marco de datos como con ggplot2. El inconveniente de este método es que debes escribir muchos más detalles de la trama. La ventaja es que tiene control sobre más detalles de la trama.
fuente
@Dirk Eddelbuettel: La idea básica es excelente, pero el código que se muestra se puede mejorar. [Toma mucho tiempo explicarlo, de ahí una respuesta separada y no un comentario.]
La
hist()
función por defecto dibuja gráficos, por lo que debe agregar laplot=FALSE
opción. Además, es más claro establecer el área de trazado mediante unaplot(0,0,type="n",...)
llamada en la que puede agregar etiquetas de eje, título de trazado, etc. Finalmente, me gustaría mencionar que también se puede usar sombreado para distinguir entre los dos histogramas. Aquí está el código:Y aquí está el resultado (un poco demasiado amplio debido a RStudio :-)):
fuente
postscript
dispositivos.La API R de Plotly puede ser útil para usted. El siguiente gráfico está aquí .
Divulgación completa: estoy en el equipo.
fuente
Tantas respuestas geniales, pero como acabo de escribir una función function (
plotMultipleHistograms()
) para hacer esto, pensé que agregaría otra respuesta.La ventaja de esta función es que establece automáticamente los límites apropiados de los ejes X e Y y define un conjunto común de contenedores que utiliza en todas las distribuciones.
Aquí se explica cómo usarlo:
La
plotMultipleHistograms()
función puede tomar cualquier número de distribuciones, y todos los parámetros de trazado general debe trabajar con él (por ejemplo:las
,main
, etc.).fuente