我正在使用循环在数据子集上创建堆积条形图。我正在为每所学校的每个变量导出一个堆积条形图。它全部成功运作 - 每个图表仅显示数据子集 - 除了x轴继续为每所学校标记。因此,我有一个带有空白的大型长图表区域,以及学校的堆积条形图,数据是子集。
以下是我的数据示例:
label variable class percent SchoolA Optimism High 67 SchoolA Optimism Med 33 SchoolA Optimism Low 20 SchoolA SelfEsteem High 84 SchoolA SelfEsteem Med 12 SchoolA SelfEsteem Low 4 SchoolB Optimism High 60 SchoolB Optimism Med 21 SchoolB Optimism Low 19 SchoolB SelfEsteem High 20 SchoolB SelfEsteem Med 42 SchoolB SelfEsteem Low 38
......继续进行数百个变量和学校。
一般来说,我这样做:
为每个学校和变量创建一个值数组
schools<-unique(df1$label)
variables<-unique(df1$variable)
将每个数据子集绘制为堆积条形图的功能
doPlot<-function(subdf){
ggplot(subdf,aes(x=label,y=percent,fill=factor(class)))+
geom_bar(stat="identity")}
使用每个数据子集运行doPlot
for(i in 1:length(schools)){
for (j in 1:length(variables)){
subdf<-data.frame(subset(df1,label==schools[i]&variable==variables[j]))
doPlot(subdf)}}
为什么图表会为原始数据集创建和标记x轴,而不仅仅是数据子集?我是一个R新手,但我一直在寻找和尝试一段时间,我很难过。
答案 0 :(得分:0)
这是因为当您使用因子列对数据框进行子集时(df1$label
是具有级别'SchoolA'和'SchoolB'的因素),label
列仍然具有多个级别,即使存在目前只有一个独特的标签。
e.g:
df2 <- subset(df1,label=='SchoolA'&variable=='Optimism')
df2$label
# [1] SchoolA SchoolA SchoolA
# Levels: SchoolA SchoolB
虽然df2$label
只是'SchoolA',但仍然有两个级别? ggplot
使用级别绘制图表。
?subset
提及:
子集化后的因素可能为空;未使用的级别 没有自动删除。请参阅'droplevels'以了解删除所有内容的方法 数据框中未使用的级别。
然后转到?droplevels
:“用于从数据框中的..因子中删除未使用的级别”。
所以试着这样做:
subdf <- droplevels(data.frame(subset(df1,label==schools[i]&variable==variables[j])))
然后你将在x轴上得到一个变量,即当前的学校。
(顺便说一下 - 是一个堆积条形图表示这些的最佳方式吗?特别是,我注意到SchoolA的'乐观'总体上增加了120%,并且堆积条形图似乎强制了解这些数据如果那不是您想要解释数据的方式,也许您可以考虑采用不同的方式来呈现数据?)