Buscamos por distintos espacios para así traerte la solución para tu duda, si continúas con alguna difcultad déjanos tu pregunta y te responderemos porque estamos para ayudarte.
Solución:
A veces es más fácil editar un grob usando grid
Las funciones de edición de – si se pueden encontrar los nombres de los grobs relevantes. En este caso, se pueden encontrar y la edición es sencilla: cambie el color de la etiqueta de negro a rojo o azul.
library(ggplot2)
library(grid)
df <- data.frame(a=rnorm(10),b=1:10,c=letters[1:10],d=c("one","two"))
p1 <-ggplot(data=df,aes(x=b,y=a))
p1 <- p1 + geom_text(aes(label = c, color=d, fontface="bold"))
p1 <- p1 + scale_color_hue(name="colors should match",breaks=c("one", "two"),
labels=c("should be salmon", "should be sky blue"))
p1
# Get the ggplot grob
g <- ggplotGrob(p1)
# Check out the grobs
grid.ls(grid.force(g))
Mire a través de la lista de grobs. Los grobs que queremos editar están en la parte inferior de la lista, en el conjunto de grobs del 'cuadro de guía', con nombres que comienzan con "label". Hay dos grumos:
etiqueta-3-3.4-4-4-4
etiqueta-4-3.5-4-5-4
# Get names of 'label' grobs.
names.grobs <- grid.ls(grid.force(g))$name
labels <- names.grobs[which(grepl("label", names.grobs))]
# Get the colours
# The colours are the same as the colours of the plotted points.
# These are available in the ggplot build data.
gt <- ggplot_build(p1)
colours <- unique(gt$data[[1]][, "colour"])
# Edit the 'label' grobs - change their colours
# Use the `editGrob` function
for(i in seq_along(labels))
g <- editGrob(grid.force(g), gPath(labels[i]), grep = TRUE,
gp = gpar(col = colours[i]))
# Draw it
grid.newpage()
grid.draw(g)
¿Qué pasaría si se requiriera que el keys ser puntos en lugar de letras? Podría ser útil porque la 'a' es un símbolo en la trama y es un símbolo en la leyenda. key. Esta no es una edición simple, como la anterior. Necesito un grob de punto para tomar el lugar del grob de texto. Dibujo grobs en las ventanas gráficas, pero si puedo encontrar los nombres de las ventanas gráficas relevantes, debería ser sencillo realizar el cambio.
# Find the names of the relevant viewports
current.vpTree() # Scroll out to the right to find he relevant 'key' viewports.
mirador[key-4-1-1.5-2-5-2]ventana[key-3-1-1.4-2-4-2],
# Well, this is convenient. The names of the viewports are the same
# as the names of the grobs (see above).
# Easy enough to get the names from the 'names.grobs' list (see above).
# Get the names of 'key' viewports(/grobs)
keys <- names.grobs[which(grepl("key-[0-9]-1-1", names.grobs))]
# Insert points grobs into the viewports:
# Push to the viewport;
# Insert the point grob;
# Pop the viewport.
for(i in seq_along(keys))
downViewport(keys[i])
grid.points(x = .5, y = .5, pch = 16, gp = gpar(col = colours[i]))
popViewport()
popViewport(0)
# I'm not going to worry about removing the text grobs.
# The point grobs are large enough to hide them.
plot = grid.grab()
grid.newpage()
grid.draw(plot)
Actualizar
Teniendo en cuenta el consejo de @user20650 para cambiar la leyenda key (ver el comentario a continuación):
p1 <-ggplot(data=df,aes(x=b,y=a))
p1 <- p1 + geom_text(aes(label = c, color=d, fontface="bold"))
p1 <- p1 + scale_color_hue(name="colors should match",breaks=c("one", "two"),
labels=c("should be salmon", "should be sky blue"))
GeomText$draw_key <- function (data, params, size)
pointsGrob(0.5, 0.5, pch = 16,
gp = gpar(col = alpha(data$colour, data$alpha),
fontsize = data$size * .pt))
p1
Luego proceda como antes para cambiar el color del texto de la leyenda.
Los colores del gráfico son los mismos que los colores de la leyenda, pero el tipo de letra de la leyenda se mantiene sin formato incluso cuando configura el tipo de letra del símbolo del gráfico en negrita (o cursiva). No estoy seguro si esto es un descuido en el diseño de ggplot2
o el comportamiento previsto. Para algunos colores, la fuente en negrita se ve más saturada que la fuente simple, lo que hace que parezca un color diferente.
En cualquier caso, aquí hay una chapuza que es mucho más fácil que meterse con grobs, pero que podría darte lo que quieres. Utilizar geom_text
con el tipo de letra simple, pero hágalo dos o tres veces seguidas (o más), para que se exceda. Esto hará que tanto los símbolos como la leyenda se vean similares a la fuente en negrita, porque ambos se sobretrazarán y los símbolos de la leyenda siempre tendrán el mismo aspecto que los símbolos de la trama.
Aquí hay un ejemplo:
library(ggplot2)
library(gridExtra)
# Original plot (with larger font size)
p1 <- ggplot(data=df) +
geom_text(aes(x=b, y=a, label=c, color=d), fontface='bold', size=8)
p1 <- p1 + scale_color_hue(name="colors should match",breaks=c("one", "two"),
labels=c("should be pink", "should be blue")) +
ggtitle("Original Plot with Bold Symbols and Plain Legend")
# New version with overplotting. (You don't need to specify 'plain' fontface.
# I've just included that to emphasize what the code is doing.)
p1.overplot <- ggplot(data=df) +
geom_text(aes(x=b, y=a, label=c, color=d), fontface='plain', size=8) +
geom_text(aes(x=b, y=a, label=c, color=d), fontface='plain', size=8) +
geom_text(aes(x=b, y=a, label=c, color=d), fontface='plain', size=8)
p1.overplot <- p1.overplot +
scale_color_hue(name="colors should match",
breaks=c("one", "two"),
labels=c("should be pink", "should be blue")) +
ggtitle("Both symbols and legend are overplotted 3 times")
Aquí hay una solución que usa ggtext
y evita editar grobs directamente. (Implica extraer los colores de la trama, pero los pasos posteriores son más fáciles de usar).
# Original code, but with a stripped-down call to `scale_color_hue` (since
# we're going to replace it).
library(ggplot2)
df <- data.frame(a=rnorm(10),b=1:10,c=letters[1:10],d=c("one","two"))
p1 <-ggplot(data=df,aes(x=b,y=a))
p1 <- p1 + geom_text(aes(label = c, color=d, fontface="bold"))
p1 <- p1 + scale_color_hue(breaks=c("one", "two"))
# Load the `ggtext` library, which lets us style (parts of) text labels.
library(ggtext)
# Build the plot so we can extract the colors that were actually used. (If you
# supply colors manually instead, this step isn't necessary.)
g1 = ggplot_build(p1)
# Add a scale with labels that are colored appropriately, using tags.
# Also specify that legend labels should be processed with `element_markdown`.
p1 +
scale_color_hue(name = "colors should match",
breaks = c("one", "two"),
labels = paste("",
c("should be pink", "should be blue"),
"",
sep = "")) +
theme(legend.text = element_markdown())
Si conservas alguna duda y disposición de progresar nuestro tutorial eres capaz de escribir un exégesis y con deseo lo ojearemos.