在数据子集上使用geom_bar时的额外x轴标签

时间:2012-03-06 00:57:45

标签: r ggplot2 subset

我正在使用循环在数据子集上创建堆积条形图。我正在为每所学校的每个变量导出一个堆积条形图。它全部成功运作 - 每个图表仅显示数据子集 - 除了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新手,但我一直在寻找和尝试一段时间,我很难过。

1 个答案:

答案 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%,并且堆积条形图似乎强制了解这些数据如果那不是您想要解释数据的方式,也许您可​​以考虑采用不同的方式来呈现数据?)