R 如何使用长标签保持ggplot的大小

R 如何使用长标签保持ggplot的大小,r,ggplot2,R,Ggplot2,我有一个图,它是一个简单的条形图,显示了每种类型事件的数量。我需要在情节下的情节标签,因为一些事件有很长的名字,并挤压了侧面的情节。我试图将标签移到绘图下面,但现在当有很多事件类型时,标签会向上挤压。是否有一种静态打印大小(即条形图)的方法,以便长图例不会挤压打印 我的代码: ggplot(counts_df, aes(x = Var2, y = value, fill - Var1)+ geom_bar(stat = "identity") + theme(legend.pos

我有一个图,它是一个简单的条形图,显示了每种类型事件的数量。我需要在情节下的情节标签,因为一些事件有很长的名字,并挤压了侧面的情节。我试图将标签移到绘图下面,但现在当有很多事件类型时,标签会向上挤压。是否有一种静态打印大小(即条形图)的方法,以便长图例不会挤压打印

我的代码:

ggplot(counts_df, aes(x = Var2, y = value, fill - Var1)+
    geom_bar(stat = "identity") +
    theme(legend.position = "bottom") +
    theme(legen.direction = "vertical") +
    theme(axis.text.x = element_text(angle = -90)
结果是:


我认为这是因为图像的大小必须是静态的,所以图被牺牲为轴。当我将图例放在绘图下方时,也会发生同样的情况。

有几种方法可以避免标签过多或挤压绘图区域,或者总体上提高可读性。建议的解决方案中哪一种最合适将取决于标签的长度、钢筋的数量以及许多其他因素。所以,你可能不得不到处玩

虚拟数据 不幸的是,OP没有包含一个可复制的示例,因此我们必须自己编制数据:

V1 <- c("Long label", "Longer label", "An even longer label",
        "A very, very long label", "An extremely long label",
        "Long, longer, longest label of all possible labels", 
        "Another label", "Short", "Not so short label")
df <- data.frame(V1, V2 = nchar(V1))
yaxis_label <- "A rather long axis label of character counts"

水平条形图 所有标签(包括y轴标签)均垂直打印,提高了可读性,但仍压缩了绘图区域(但由于图表采用横向格式,因此程度较小):

包装标签的垂直条形图 标签垂直打印,避免过涂,减少打印区域的挤压。您可能需要在
stringr::str_wrap
中使用
width
参数

q <- p + aes(stringr::str_wrap(V1, 15), V2) + xlab(NULL) +
  ylab(yaxis_label)
q

附录:使用
scale\u x\u discrete()缩写标签
为了完整起见,应该提到,
ggplot2
能够缩写标签。在这种情况下,我觉得结果令人失望

p + scale_x_discrete(labels = abbreviate)

为了澄清,这个问题似乎要问的是如何在ggplot2中指定面板大小

我相信这个问题的正确答案是‘你就是做不到’

到目前为止,似乎没有任何参数可以在任何ggplot2函数中设置以实现此目的。如果有,我认为它很可能以
高度
宽度
参数的形式,在调用
主题
的过程中调用
元素
(这就是我们对面板进行其他更改的方式,例如改变其背景颜色),但是在文档中没有类似于
element_rect
的内容,因此我最好的猜测是指定面板大小是不可能的:

以下参考文献很旧,但我找不到任何更为最新的资料,可以肯定这是否属实:


在那次讨论中,有人问是否可以指定面板的大小,哈德利说“还没有,但它在我的任务清单上”。那是九年前;我想这仍然在他的任务清单上

我发现其他方法没有达到我想要的效果。我做这个函数是为了在长名字后面加几个点


tidy_name <- function(name, n_char) {
  ifelse(nchar(name) > (n_char - 2), 
    {substr(name, 1, n_char) %>% paste0(., "..")},
    name)
}

vec <- c("short", "medium string", "very long string which will be shortened")

vec %>% tidy_name(20)

# [1] "short"   "medium string"   "very long string whi.."



整洁的名称(n_char-2),
{substr(name,1,n_char)%%>%paste0(,“.”)},
(姓名)
}
车辆%u名称(20)
#[1]“短”“中字符串”“非常长的字符串”

除上述解决方案外,还有一种解决方案-使用交错标签。这些可与文本换行一起使用,以获得相当可读的结果:

p + scale_x_discrete(guide = ggplot2::guide_axis(n.dodge = 2), 
                     labels = function(x) stringr::str_wrap(x, width = 20))
(使用@Uwe答案中的绘图
p


最好有一个可复制的例子:至少是我们能理解的情节?@timat。我添加了plot@SebastianZeki,导出绘图时,使用
宽度
高度
参数,使上部不是方形。也可以将x标签角度更改为60。对齐左侧的x标签(勾号旁边),更改长标签,使其显示在两行上。这将减少x标签部件的大小。egg::set_panel_size可能有助于回答这个问题。很抱歉,这并没有回答问题,该问题询问了如何实现“静态打印大小(即条形图)”。这里提出的各种选项只是减轻了标签长度对打印尺寸的影响程度。绘图大小将继续变化。如果无法在ggplot2内稳定绘图大小(相对于图像的整体尺寸),请在回答的开头这样说,我将向上投票(假设这是真的)。@Uwe您的回答对我来说非常有用,我要感谢您!我在这里找到了一个解决方案:
cowplot::align_plots
能够获取具有不同打印/轴区域的打印列表,并将它们全部对齐为相同。还没有时间深入研究它是如何工作的,但是快速查看函数应该不太难弄清楚是什么参数控制绘图/轴区域。
q + coord_flip()
p + scale_x_discrete(labels = abbreviate)

tidy_name <- function(name, n_char) {
  ifelse(nchar(name) > (n_char - 2), 
    {substr(name, 1, n_char) %>% paste0(., "..")},
    name)
}

vec <- c("short", "medium string", "very long string which will be shortened")

vec %>% tidy_name(20)

# [1] "short"   "medium string"   "very long string whi.."


p + scale_x_discrete(guide = ggplot2::guide_axis(n.dodge = 2), 
                     labels = function(x) stringr::str_wrap(x, width = 20))