在ggplot2中为长X标签手动创建缩写图例

Jul*_*rre 8 r legend ggplot2

我想用ggplot2创建一个简单的条形图,我的问题是我的x变量包含长字符串,所以标签是重叠的.

这是假数据和情节:

library(dplyr)
library(tidyr)
library(ggplot2)

set.seed(42)
datas <- data.frame(label = sprintf("aLongLabel%d", 1:8), 
           ok = sample(seq(0, 1, by = 0.1), 8, rep = TRUE)) %>% 
  mutate(err = abs(ok - 1)) %>% 
  gather(type, freq, ok, err)

datas %>% 
  ggplot(aes(x = label, y = freq)) + 
  geom_bar(aes(fill = type), stat = "identity")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想用较短的标签替换标签,并创建一个图例来显示匹配.

我尝试过的:

我在geo_point中使用了形状aes参数,它将创建一个带有形状的图例(以及我隐藏的图形形状alpha = 0).然后我改变形状scale_shape_manual并用x替换x标签scale_x_discrete.随着guides我重写我的形状的α参数,以便他们不会在图例中不可见.

leg.txt <- levels(datas$label)
x.labels <- structure(LETTERS[seq_along(leg.txt)], 
                      .Names = leg.txt)

datas %>% 
  ggplot(aes(x = label, y = freq)) + 
  geom_bar(aes(fill = type), stat = "identity") + 
  geom_point(aes(shape = label), alpha = 0) + 
  scale_shape_manual(name = "Labels", values = x.labels) + 
  guides(shape = guide_legend(override.aes = list(size = 5, alpha = 1))) + 
  scale_x_discrete(name = "Label", labels = x.labels)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

它给了我预期的输出,但我觉得这非常hacky.

ggplot2是否提供了更直接地执行此操作的方法?谢谢.

Jul*_*rre 2

帕斯卡建议的旋转解决方案

旋转标签并将其与边缘对齐:

datas %>% 
  ggplot(aes(x = label, y = freq)) + 
  geom_bar(aes(fill = type), stat = "identity") + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述