【问题标题】:Stagger axis labels, new feature in ggplot2交错轴标签,ggplot2 中的新功能
【发布时间】:2016-08-27 10:01:55
【问题描述】:

您好:我需要绘制一个包含 81 个不同类别的因子,每个类别具有不同的频率计数。每个因子名称都是一个 4 个字母的类别。它看起来像这样。如您所见,阅读因子标签非常困难。我想根据this 的建议错开y 轴。但是,github 上的this 问题表明 ggplot2 发生了一些变化,并且 hjust 和 vjust 选项不再起作用。有没有人有任何建议让这个图看起来更好,特别是让因子水平可读。

#libraries
# install.packages('stringi')
library(ggplot2)
library(stringi)
#fake data
var<-stri_rand_strings(81, 4, pattern='[HrhEgeIdiFtf]')
var1<-rnorm(81, mean=175, sd=75)
#data frame
out<-data.frame(var, var1)

#set levels for plotting
out$var<-factor(out$var, levels=out$var[order(out$var1, decreasing=FALSE)])
#PLot
out.plot<-out %>%
ggplot(., aes(x=var, y=var1))+geom_point()+coord_flip()
#Add staggered axis option
out.plot+theme(axis.text.y = element_text(hjust = grid::unit(c(-2, 0, 2),     "points")))

【问题讨论】:

  • 解决方法是将标签旋转 90 度。
  • 我知道那个,但希望有一个不同的解决方案。

标签: r plot ggplot2


【解决方案1】:

要错开标签,您可以在数据框中的标签中添加空格。

# Libraries
library(ggplot2)
library(stringi)

# fake data
set.seed(12345)
var <- stri_rand_strings(81, 4, pattern = '[HrhEgeIdiFtf]')
var1 <- rnorm(81, mean = 175, sd = 75)

out <- data.frame(var, var1)

# Add spacing, and set levels for plotting
out = out[order(out$var1), ]
out$var = paste0(out$var, c("", "       ", "            "))
out$var <- factor(out$var, levels = out$var[order(out$var1, decreasing = FALSE)])

# Plot
out.plot <- ggplot(out, aes(x = var, y = var1)) +
   geom_point() + coord_flip()
out.plot

或者,绘制原始图,然后进行编辑。在这里,我使用grid 函数editGrob() 进行编辑。

# Libraries
library(ggplot2)
library(gtable)
library(grid)
library(stringi)

# fake data
set.seed(12345)

var <- stri_rand_strings(81, 4, pattern = '[HrhEgeIdiFtf]')
var1 <- rnorm(81, mean = 175, sd = 75)

out <- data.frame(var, var1)

# Set levels for plotting
out$var <- factor(out$var, levels = out$var[order(out$var1, decreasing = FALSE)])

# Plot
out.plot <- ggplot(out, aes(x = var, y = var1)) +
   geom_point() + coord_flip()

# Get the ggplot grob
g = ggplotGrob(out.plot)

# Get a hierarchical list of component grobs
grid.ls(grid.force(g))

浏览列表以找到与左轴相关的部分。相关位是:

轴-l.6-3-6-3 axis.line.y..zeroGrob.232 轴 轴1-1-1-1 GRID.text.229 轴 1-2-1-2

您需要设置从“axis-l”到“axis”、“axis”、“GRID.text”的路径。

# make the relevant column a little wider
g$widths[3] = unit(2.5, "cm")

# The edit
g = editGrob(grid.force(g), 
      gPath("axis-l", "axis", "axis", "GRID.text"), 
      x = unit(c(-1, 0, 1), "npc"), 
      grep = TRUE)

# Draw the plot
grid.newpage()
grid.draw(g)

另一种选择是通过结构找到相关的 grob 以进行编辑。

# Get the grob
g <- ggplotGrob(out.plot)

# Get the y axis
index <- which(g$layout$name == "axis-l")  # Which grob
yaxis <- g$grobs[[index]]   

# Get the ticks (labels and marks)
ticks <- yaxis$children[[2]]

# Get the labels
ticksL <- ticks$grobs[[1]]

# Make the edit
ticksL$children[[1]]$x <- rep(unit.c(unit(c(1,0,-1),"npc")), 27)

# Put the edited labels back into the plot
ticks$grobs[[1]] <- ticksL
yaxis$children[[2]] <- ticks
g$grobs[[index]] <- yaxis

# Make the relevant column a little wider
g$widths[3] <- unit(2.5, "cm")

# Draw the plot
grid.newpage()
grid.draw(g)

【讨论】:

    【解决方案2】:

    Sandy 提到在标签中添加空格。 使用离散轴,您还可以简单地在替代情况下添加换行符。就我而言,我想错开替代的:

    scale_x_discrete(labels=paste0(c("","\n"),net_change$TZ_t)
    

    net_change$TZ_t 是我的有序因子。通过c("","\n","\n\n"),它可以轻松扩展到“三重”级别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多