【问题标题】:Extra x axis labels when using geom_bar on a subset of data在数据子集上使用 geom_bar 时额外的 x 轴标签
【发布时间】:2012-03-06 00:57:45
【问题描述】:

我正在使用循环在数据子集上创建堆积条形图。我正在为每所学校的每个变量导出一个堆积条形图。一切顺利——每个图表只显示数据的子集——除了 x 轴继续为每所学校标记。所以我有一个很大的带有空白的长图表区域,以及一个堆叠的条形图,上面是学校的数据子集。

这是我的数据示例:

标签变量类百分比
SchoolA 乐观情绪高 67
SchoolA Optimism Med 33
SchoolA 乐观情绪低 20
SchoolA 自尊高中 84
SchoolA 自尊医学 12
SchoolA 自尊低 4
SchoolB 乐观情绪高 60
SchoolB 乐观主义医学 21
SchoolB 乐观情绪低 19
SchoolB 自尊高中 20
SchoolB 自尊医学 42
SchoolB 自尊低 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 新手,但我一直在搜索和尝试一段时间,但我很困惑。

【问题讨论】:

    标签: r ggplot2 subset


    【解决方案1】:

    这是因为当您使用因子列(df1$label 是具有“SchoolA”和“SchoolB”级别的因子)对数据框进行子集时,label 列仍然具有多个级别,即使当前只有一个唯一的在里面贴上标签。

    例如:

    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%,堆积条形图似乎强化了对数据的这种理解. 如果这不是您想要解释数据的方式,也许您可​​以考虑另一种呈现方式?)

    【讨论】:

    • 谢谢 math.coffee!使用 droplevels 解决了它。为什么我们要创建堆叠条形图是一个很长的故事,并且一直存在争议,但是对于将它们输入堆叠条形图的报告来说似乎是可行的。 SchoolA 的“乐观”加起来高达 120% 是我的虚拟数据中的一个错误 - 感谢您的发现。
    猜你喜欢
    • 1970-01-01
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2020-11-20
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多