名称很长的 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
中保持顺序)。
如果你能给我一个双方面的答案,我将不胜感激:
- 如何在标准
barplot
和 中将标签 放入 条中
- 如何在
ggplot
中保持 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))
我想生成存储在数据框中的 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
中保持顺序)。
如果你能给我一个双方面的答案,我将不胜感激:
- 如何在标准
barplot
和 中将标签 放入 条中
- 如何在
ggplot
中保持
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))