为 ggplot2 中的长 X 标签手动创建缩写图例
Create abbreviated legends manually for long X labels in 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")
我想用较短的标签替换标签并创建一个图例来显示匹配项。
我尝试过的:
我在 geo_point 中使用形状 aes 参数,这将创建一个带有形状的图例(并绘制我用 alpha = 0
隐藏的形状)。然后我用 scale_shape_manual
改变形状,用 scale_x_discrete
替换 x 标签。使用 guides
我覆盖了形状的 alpha 参数,因此它们不会在图例中不可见。
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)
它给了我预期的输出,但我觉得这很老套。
ggplot2 是否提供了一种更直接地执行此操作的方法?谢谢。
Pascal 建议的旋转解决方案
旋转标签并将它们对齐到边缘:
datas %>%
ggplot(aes(x = label, y = freq)) +
geom_bar(aes(fill = type), stat = "identity") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
我想用 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")
我想用较短的标签替换标签并创建一个图例来显示匹配项。
我尝试过的:
我在 geo_point 中使用形状 aes 参数,这将创建一个带有形状的图例(并绘制我用 alpha = 0
隐藏的形状)。然后我用 scale_shape_manual
改变形状,用 scale_x_discrete
替换 x 标签。使用 guides
我覆盖了形状的 alpha 参数,因此它们不会在图例中不可见。
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)
它给了我预期的输出,但我觉得这很老套。
ggplot2 是否提供了一种更直接地执行此操作的方法?谢谢。
Pascal 建议的旋转解决方案
旋转标签并将它们对齐到边缘:
datas %>%
ggplot(aes(x = label, y = freq)) +
geom_bar(aes(fill = type), stat = "identity") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))