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

时间:2019-04-05 04:08:55

标签: r ggplot2

我建立了一个图形并使用了coord_polar函数。但是,x标签太长,因此我使用了str_wrap()库中的stringr函数来包装它们。不幸的是,在绘制它们时,每个标签中的文本都居中。

我希望文本 IN 的标签向左对齐,通常是通过hjust中的theme()函数来完成的,但是使用{{1} } 这是行不通的。我在做什么错了?

数据:

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)

Plot

1 个答案:

答案 0 :(得分: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