R barplot有很长的名字

时间:2015-05-21 20:50:44

标签: r ggplot2 label bar-chart

我想制作一个存储在数据框中的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)

足够接近,但是名字仍然很长,他们不适合(如果我尝试低于0.5的cex.names则变得不可读)。 我也试过了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中的顺序。)

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

  • 如何将标签放在标准barplot
  • 如何在df
  • 中保留ggplot项目的顺序

提前致谢!   -

2 个答案:

答案 0 :(得分:1)

一边回答,

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))

但是,有些小条要小,以包含名称。

答案 1 :(得分:1)

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))