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")