如何在ggplot2中的coord极坐标图中将标签中的文本对齐?

问题描述 投票:2回答:1

我构建了一个图表并使用了coord_polar函数。但是,x标签太长了,所以我使用了str_wrap()库中的stringr函数来包装它们。不幸的是,当它们被绘制时,每个标签中的文本都居中。

我希望标签中的文本对齐到左侧,通常这是使用hjust中的theme()函数完成的,但是当使用coord_polar()时它不起作用。我究竟做错了什么?

数据:

 preguntas = c("Mi superior restringe mis posibihdlidades de comunicarme,hablar o reunirme con él",
          "Me ignoran, me excluyen o me hfacen el vacio, fingen no verme o me hacfen invisible",
          "Me interrumpen continuamente impidiendo expfresarme","Me fuerzan a realifzar trabajos que van contra mis principios o mi ética",
          "Evalúan mi trabajo de manera inequitativfa o de forma sesgada","Me dejan sifn ningún trabajo que hacer, ni siquiera a iniciativa propia",
          "Me asignan tareas o trabajos absurdos o sin sentido","Me impiden que adopte flas medidas de seguridad necesarias para realizar mi trabajo con la debida seguridad",
          "Mi superior restringe mis posibilidades de comunicarme, hablar o reunirme conf él",
          "Me ignoran, me excluyen o me hacen el vacio, fingen no verme o me hacen invisifble",
          "Me interrumpen continuamente impidiendo expresarme","Me fuerzan a realizar trabfajos que van contra mis principios o mi ética",
          "Evalúan mi trabajo de manera idnequitativa o de forma sesgada","Me dejan sin ningfún trabajo que hacer, ni siquiera a iniciativa propia",
          "Me asignan tareas o trabajos absurdos o sin sefntido","Me impiden que adopte las mfedidas de seguridad necesarias para realizar mi trabajo con la debida seguridad",
          "Mi superior restringe mis posibilidades de comufnicarme", "hablar o reunirme con éfl",
          "Me ignoran, me excluyen o me hacen el vacio, fingen no verme o me hacen invisiblfe",
          "Me interrumpen continuamente impidiendo expresarmfe","Me fuerzan a realizar trabajfos que van contra mis principios o mi ética",
          "Evalúan mi trabajo de manera inequitativa o de fforma sesgada","Me dejan sin ningúnf trabajo que hacer, ni siquiera a iniciativa propia",
          "Me asignan tareas o trabajos absurdos o sin senftido","Me impiden que adopte las medfidas de seguridad necesarias para realizar mi trabajo con la debida seguridad",
          "Mi superior restringe mis posibilidades de comfunicarme, hablar o reunifrme con él",
          "Me ignoran, me exclujyen o me hacen el vacio, ffingen no verme o me hacenf invisible",
          "Me interrumpen continuamente impidiendo exprfesarme","Me fuerzan a realizfar trabajos que van contra mis principios o mi ética",
          "Evalúan mi trabajo de manera inequitativa of de forma sesgada","Me dejan sfin ningún trabajo que hacer, ni siquiera a iniciativa propia",
          "Me asignan tareas o trabajos absurdos o sifn sentido","Me impiden que adoptfe las medidas de seguridad necesarias para realizar mi trabajo con la debida seguridad",
          "Mi superior restringe mis posibilidades dfe comunicarme, hablar o reunirme cfon él",
          "Me ignoran, me excluyen o me hacen el vafcio, fingen no verme o me hacen invifsible",
          "Me interrumpen continuamente impidiendof expresarme","Me fuerzan a realizar trfabajos que van contra mis principios o mi ética",
          "Evalúan mi trabajo de manera inequitatfiva o de forma sesgada","Me dejan sin nifngún trabajo que hacer, ni siquiera a iniciativa propia",
          "Me asignan tareas o trabajos absurdosf o sin sentido","Me impiden que adopte lasf medidas de seguridad necesarias para realizar mi trabajo con la debida seguridad",
          "Evalúan mi trabajo de magnera inequitatfiva o de forma sesgada","Me dejan siin nifngún trabajo que hacer, ni siquiera a iniciativa propia")
valores = floor(runif(43, min=1, max=6))

dataset = data.frame(preguntas, valores)

码:

library(ggplot2)
library(stringr)

dataset$preguntasCortas = str_wrap(dataset$preguntas, width = 8)

ggplot (data = dataset, 
    aes(x = preguntasCortas, y = valores, fill = valores)
) +
   geom_bar(width = .4, stat = "identity", na.rm = TRUE)+
   scale_fill_gradient(low = "gray", high = "red", limits = c(1, 6)) + 
   coord_polar() + 
   scale_y_discrete(limits = c(0,7)) + 
   theme(
        axis.text.y = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 0,hjust = 0),
        legend.title = element_blank(), 
        legend.text = element_text(size = 10),  
        axis.title =  element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "transparent", color = NA),        
        plot.margin = unit(c(-.1, -.1, -.1, -.1), "cm"),
        text = element_text(
        family = "Century Gothic", size=5, color = "#595959"
    )
)

Plot

r ggplot2
1个回答
1
投票

在极坐标中,hjust / vjust参数值在CoordPolar$render_fg中被硬编码为0.5(参见源代码here)。

您可以通过定义自己的CoordPolar版本来解决它,它在hjust中以不同的方式编码render_fg,并定义一个coord_polar2()函数来调用它而不是原始的CoordPolar

CoordPolar2 <- ggproto("CoordPolar2",
                       CoordPolar,
                       render_fg = function (self, panel_params, theme) {
                         if (is.null(panel_params$theta.major)) {
                           return(element_render(theme, "panel.border"))
                         }
                         theta <- ggplot2:::theta_rescale(self, panel_params$theta.major, panel_params)
                         labels <- panel_params$theta.labels
                         theta <- theta[!is.na(theta)]
                         ends_apart <- (theta[length(theta)] - theta[1])%%(2 * pi)
                         if (length(theta) > 0 && ends_apart < 0.05) {
                           n <- length(labels)
                           if (is.expression(labels)) {
                             combined <- substitute(paste(a, "/", b), list(a = labels[[1]], 
                                                                           b = labels[[n]]))
                           }
                           else {
                             combined <- paste(labels[1], labels[n], sep = "/")
                           }
                           labels[[n]] <- combined
                           labels <- labels[-1]
                           theta <- theta[-1]
                         }
                         grid::grobTree(if (length(labels) > 0) 
                           ggplot2:::element_render(theme, 
                                          "axis.text.x", 
                                          labels,
                                          unit(0.45 * sin(theta) + 0.5, "native"),
                                          unit(0.45 * cos(theta) + 0.5, "native"), 
                                          hjust = 0, # hjust = 0.5,
                                          vjust = 0.5), 
                           ggplot2:::element_render(theme, "panel.border"))
                       })

coord_polar2 <- function (theta = "x", start = 0, direction = 1, clip = "on") {
  theta <- match.arg(theta, c("x", "y"))
  r <- if (theta == "x") 
    "y"
  else "x"
  ggproto(NULL, 
          CoordPolar2, #CoordPolar,
          theta = theta, r = r, start = start, 
          direction = sign(direction), clip = clip)
}

用法示例(我简化了代码并仅采用前几行数据进行说明):

p <- ggplot(data = dataset[1:8, ], # first 8 rows
            aes(x = preguntasCortas, y = valores, fill = valores)) +
  geom_col(width = .4, na.rm = TRUE)+
  scale_fill_gradient(low = "gray", high = "red", limits = c(1, 6)) + 
  scale_y_discrete(limits = c(0,7)) + 
  theme_void() +
  theme(axis.text.x = element_text(size = 5, lineheight = 0.9, angle = 45))

cowplot::plot_grid(
  p + coord_polar(),
  p + coord_polar2(),
  nrow = 1,
  labels = c("Original", "New")
)

plot

© www.soinside.com 2019 - 2024. All rights reserved.