名称很长的 R barplot

R barplot with very long names

我想生成存储在数据框中的 10 个项目的条形图:

df <- structure(list(v = structure(c(0.133177575198731, 0.048416489312887, 
0.0323328322269662, 0.0257842168974815, 0.0207946396185765, 0.0157952295839215, 
0.015414483430714, 0.0138292246981344, 0.0136598827935515, 0.0132108536143025
), .Dim = 10L, .Dimnames = structure(list(c("HIPERTENSION ESENCIAL (PRIMARIA)", 
"RINOFARINGITIS AGUDA", "DIARREA Y GASTROENTERITIS DE PRESUNTO ORIGEN INFECCIOSO", 
"LUMBAGO NO ESPECIFICADO", "INFECCION DE VIAS URINARIAS, SITIO NO ESPECIFICADO", 
"AMIGDALITIS AGUDA, NO ESPECIFICADA", "FIEBRE, NO ESPECIFICADA", 
"CEFALEA", "DOLOR EN ARTICULACION", "HIPOTIROIDISMO, NO ESPECIFICADO"
)), .Names = "")), names = c("HIPERTENSION ESENCIAL (PRIMARIA)", 
"RINOFARINGITIS AGUDA", "DIARREA Y GASTROENTERITIS DE PRESUNTO ORIGEN INFECCIOSO", 
"LUMBAGO NO ESPECIFICADO", "INFECCION DE VIAS URINARIAS, SITIO NO ESPECIFICADO", 
"AMIGDALITIS AGUDA, NO ESPECIFICADA", "FIEBRE, NO ESPECIFICADA", 
"CEFALEA", "DOLOR EN ARTICULACION", "HIPOTIROIDISMO, NO ESPECIFICADO"
)), .Names = c("v", "names"), row.names = c("HIPERTENSION ESENCIAL (PRIMARIA)", 
"RINOFARINGITIS AGUDA", "DIARREA Y GASTROENTERITIS DE PRESUNTO ORIGEN INFECCIOSO", 
"LUMBAGO NO ESPECIFICADO", "INFECCION DE VIAS URINARIAS, SITIO NO ESPECIFICADO", 
"AMIGDALITIS AGUDA, NO ESPECIFICADA", "FIEBRE, NO ESPECIFICADA", 
"CEFALEA", "DOLOR EN ARTICULACION", "HIPOTIROIDISMO, NO ESPECIFICADO"
), class = "data.frame")

我选择了标准 barplot 并且效果很好,只是名称太长,因此不适合任何合理的框架。

barplot(df$v,names = rownames(df),las=3,cex.names=0.5)

足够接近,但名称仍然太长,不适合(如果我尝试 cex.names 低于 0.5,它将变得不可读)。 我也试过 ggplot:

library(ggplot2)

ggplot(df,aes(x=names,y=v))+
   geom_bar(stat="identity")

ggplot(df,aes(x=names,y=v))+
   geom_bar(stat="identity")+
   theme(text = element_text(size=12),
         axis.text.x = element_text(angle=90, vjust=2))

这给出了一个非常近似的结果,但后来我一直无法找到如何保持降序(ggplot 在 x 中对名称进行排序,而不是在 df 中保持顺序)。

如果你能给我一个双方面的答案,我将不胜感激:

提前致谢! -

片面的回答,

at <- barplot(df$v,names="",axes=2)
text(at,rep(0.001,length(df$v)),rownames(df),srt=90,cex = 0.5,adj = c(0,0))

但是,有些栏太小无法包含名称。

ggplot 并没有真正对事物进行重新排序,而是将其强制为一个因素,而 factor (默认情况下)按字母顺序对事物进行排序。解决方案是创建一个指定级别顺序的因子:

df$id = factor(row.names(df), levels = row.names(df))

ggplot(df, aes(x = id, y = v)) + geom_bar(stat = "identity") +
    theme(text = element_text(size=12),
          axis.text.x = element_text(angle=90, vjust=0.5, hjust = 1))