qplot instalar ggplot como barplot r ggplot2

instalar - ggplot2 r install



Cómo combinar leyendas de color, estilo de línea y forma en ggplot (5)

Supongamos que tengo el siguiente diagrama en ggplot:

Se generó utilizando el siguiente código:

x <- seq(0, 10, by = 0.2) y1 <- sin(x) y2 <- cos(x) y3 <- cos(x + pi / 4) y4 <- sin(x + pi / 4) df1 <- data.frame(x, y = y1, Type = as.factor("sin"), Method = as.factor("method1")) df2 <- data.frame(x, y = y2, Type = as.factor("cos"), Method = as.factor("method1")) df3 <- data.frame(x, y = y3, Type = as.factor("cos"), Method = as.factor("method2")) df4 <- data.frame(x, y = y4, Type = as.factor("sin"), Method = as.factor("method2")) df.merged <- rbind(df1, df2, df3, df4) ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point()

Me gustaría tener solo una leyenda que muestre correctamente las formas, los colores y los tipos de línea (las leyendas de interacción (Tipo, Método) son las más cercanas a lo que me gustaría, pero no tiene las formas / tipos de línea correctos) .

Sé que si uso scale_xxx_manual y especifico las mismas etiquetas para todas las leyendas, se fusionarán, pero no quiero tener que configurar las etiquetas manualmente: si hay nuevos Métodos o Tipos, no quiero tener para modificar mi código : un deseo algo genérico.

Editar

Como se señala en las respuestas a continuación, hay varias formas de hacer el trabajo en este caso particular. Todas las soluciones propuestas requieren establecer manualmente los tipos y formas de línea de leyenda, ya sea mediante el uso de scale_xxx_manual function con la función de guides .

Sin embargo, las soluciones propuestas todavía no funcionan en el caso general: por ejemplo, si agrego un nuevo marco de datos al conjunto de datos con un nuevo Método "método3", ya no funciona, tenemos que agregar manualmente el nuevo formas de leyenda y tipos de línea:

y5 <- sin(x - pi / 4) df5 <- data.frame(x, y = y5, Type = as.factor("sin"), Method = as.factor("method3")) df.merged <- rbind(df1, df2, df3, df4, df5) override.shape <- c(16, 17, 16, 17, 16) override.linetype <- c(1, 1, 3, 3, 4) g <- ggplot(df.merged, aes(x, y, colour = interaction(Type, Method), linetype = Method, shape = Type)) + geom_line() + geom_point() g <- g + guides(colour = guide_legend(override.aes = list(shape = override.shape, linetype = override.linetype))) g <- g + scale_shape(guide = FALSE) g <- g + scale_linetype(guide = FALSE) print(g)

Esto da:

Ahora la pregunta es: ¿cómo generar automáticamente los vectores override.shape y override.linetype ?

Tenga en cuenta que el tamaño del vector es 5 porque tenemos 5 curvas, mientras que el factor de interaction(Type, Method) tiene un tamaño 6 (no tengo datos para la combinación cos / method3)


Aquí está la solución en el caso general:

# Create the data frames x <- seq(0, 10, by = 0.2) y1 <- sin(x) y2 <- cos(x) y3 <- cos(x + pi / 4) y4 <- sin(x + pi / 4) y5 <- sin(x - pi / 4) df1 <- data.frame(x, y = y1, Type = as.factor("sin"), Method = as.factor("method1")) df2 <- data.frame(x, y = y2, Type = as.factor("cos"), Method = as.factor("method1")) df3 <- data.frame(x, y = y3, Type = as.factor("cos"), Method = as.factor("method2")) df4 <- data.frame(x, y = y4, Type = as.factor("sin"), Method = as.factor("method2")) df5 <- data.frame(x, y = y5, Type = as.factor("sin"), Method = as.factor("method3")) # Merge the data frames df.merged <- rbind(df1, df2, df3, df4, df5) # Create the interaction type.method.interaction <- interaction(df.merged$Type, df.merged$Method) # Compute the number of types and methods nb.types <- nlevels(df.merged$Type) nb.methods <- nlevels(df.merged$Method) # Set the legend title legend.title <- "My title" # Initialize the plot g <- ggplot(df.merged, aes(x, y, colour = type.method.interaction, linetype = type.method.interaction, shape = type.method.interaction)) + geom_line() + geom_point() # Here is the magic g <- g + scale_color_discrete(legend.title) g <- g + scale_linetype_manual(legend.title, values = rep(1:nb.types, nb.methods)) g <- g + scale_shape_manual(legend.title, values = 15 + rep(1:nb.methods, each = nb.types)) # Display the plot print(g)

El resultado es el siguiente:

  • Las curvas sinusales se dibujan como líneas continuas y las curvas de coseno como líneas discontinuas.
  • Los datos del "método1" usan círculos rellenos para la forma.
  • Los datos del "método2" usan un triángulo relleno para la forma.
  • Los datos del "método3" usan diamantes rellenos para la forma.
  • La leyenda coincide con la curva.

Para resumir, los trucos son:

  • Use la interaction Tipo / Método para todas las representaciones de datos (color, forma, tipo de línea, etc.)
  • Luego configure manualmente los estilos de curva y los estilos de leyendas con scale_xxx_manual .
  • scale_xxx_manual permite proporcionar un vector de valores que es más largo que el número real de curvas, por lo que es fácil calcular los valores del vector de estilo a partir de los tamaños de los factores Tipo y Método

El siguiente código da como resultado la leyenda deseada, si entiendo su pregunta, pero no estoy seguro de entender el problema de la etiqueta, así que avíseme si esto no es lo que estaba buscando.

p = ggplot(df.merged, aes(x, y, colour=interaction(Type, Method), linetype=interaction(Type, Method), shape=interaction(Type, Method))) + geom_line() + geom_point() p + scale_shape_manual(values=rep(16:17, 2)) + scale_linetype_manual(values=rep(c(1,3),each=2))


Tuve este problema el otro día. La sección R Cookbook sobre Legends explica:

Si utiliza tanto el color como la forma, ambos deben recibir especificaciones de escala. De lo contrario, habrá dos dos leyendas separadas.

En su caso, necesita especificaciones de shape y linetype .

Editar

Era importante tener los mismos datos creando las formas, colores y líneas. Combiné su fase de interacción definiendo la columna directamente. En lugar de scale_linetype_discrete para crear la leyenda, utilicé scale_linetype_manual para especificar los valores, ya que tomarán cuatro valores diferentes por defecto.

Si desea un diseño detallado de todas las formas y tipos de línea posibles, consulte este sitio de Gráficos R para ver todos los identificadores de números:

df.merged$int <- paste(df.merged$Type, df.merged$Method, sep=".") ggplot(df.merged, aes(x, y, colour = int, linetype=int, shape=int)) + geom_line() + geom_point() + scale_colour_discrete("") + scale_linetype_manual("", values=c(1,2,1,2)) + scale_shape_manual("", values=c(17,17,16,16))


Uno solo necesita nombrar ambas guías de la misma manera. Por ejemplo:

g+ scale_linetype_manual(name="Guide1",values= c(''solid'', ''solid'', ''dotdash''))+ scale_colour_manual(name="Guide1", values = c("blue", "green","red"))


Use labs() y establezca el mismo valor para todas las estéticas que definen la apariencia de geoms.

library(''ggplot2'') ggplot(iris) + aes(x = Sepal.Length, y = Sepal.Width, color = Species, linetype = Species, shape = Species) + geom_line() + geom_point() + labs(color = "Guide name", linetype = "Guide name", shape = "Guide name")