【问题标题】:Placement of bar graph color legend with asyvars使用 asyvars 放置条形图颜色图例
【发布时间】:2025-11-26 13:30:01
【问题描述】:

我无法将颜色图例放置在我试图在 Stata 中组合的简单条形图中。我想避免使用图形编辑器并尝试从 do 文件中解决这个问题。

我正在使用blindschemes 包中的plottig 方案。 我希望将图例放置在图表的右侧,就像在 R 中的 ggplot 类型的条形图中一样。

我使用的命令是

graph bar if wparties==1, over(issue_num) missing blabel(group) by(crisis) asyvars

结果如下图:

如果需要,我可以提供样本数据集,但涉及保密问题。

【问题讨论】:

    标签: graph bar-chart stata


    【解决方案1】:

    您需要做的就是提供具有相同结构的假数据集,或者使用 Stata 提供的数据集之一进行说明。但是很容易伪造具有相似复杂性的数据集。我在这里看到两个分类变量,一个有 9 个类别,没有明显的顺序,另一个有 3 个类别,有明确的时间顺序。正在绘制的是响应的百分比,大概是针对某些问题,例如什么是最重要的问题。

    我的答案不是您直接要求的,因为即使是严肃的研究人员,这种设计(尽管非常受欢迎)在我看来在空间使用和可读性方面也非常糟糕和低效。使用传说——有人说是钥匙——充其量是一种必要的邪恶。在这里,很少有人想要或能够记住这个传说。明显的后果是双重的。首先,很多人会在原则上理解您的图表(它只是一个条形图),但不会深入了解它。其次,其他人会尝试参与其中,但不得不在图例和图表之间反复来回走动。任意着色无济于事。传奇人物的不同位置不会有太大帮助。

    这是一个独立代码中的假数据集和我的替代建议,使用tabplotStata Journal)。 search tabplot 在最新的 Stata 中将指向

    SJ-16-2 gr0066 。 . . . . .口语Stata:多个条形图 表格形式 (如果安装了帮助 tabplot)。 . . . . . . . . . . . . . . .新泽西州考克斯 Q2/16 SJ 16(2):491--510

    provides multiple bar charts in table form representing
    contingency tables for one, two, or three categorical variables
    

    在 2019 年第二季度之前需要订阅或付费才能访问,但您可以从将显示的链接免费下载该程序。帐户here 可免费访问。

    clear 
    set obs 27 
    set seed 2803 
    egen issue = seq(), to(9) 
    egen crisis = seq(), to(3) block(9) 
    label def crisis 1 "first crisis" 2 "second crisis" 3 "third crisis" 
    label val crisis crisis 
    label def issue 1 Stark 2   Targaryen 3 Lannister 4 Baratheon 5 Arryn ///
    6   Greyjoy 7   Martell 8   Tully 9 Tyrell
    label val issue issue 
    gen percent = runiform()^2 
    egen total = total(percent), by(crisis) 
    replace percent = 100 * percent/total
    
    tabplot issue crisis [iw=percent], horizontal ///
    showval(format(%2.1f) mlabsize(vsmall) offset(0.25)) ///
    ytitle("") xtitle("") 
    

    注意事项:

    1. 您的真实数据具有比这更多的结构。自然有对 y 轴上的类别进行重新排序的空间。

    2. 如果您愿意,您可以使用不同的颜色条。

    3. 我使用了scheme s1color,但您显然可以使用自己喜欢的。

    4. 您的九个类别的文本比我的长,更有理由将它们放在可读性强的位置,这意味着水平放置在垂直轴上。它们只是在水平轴上不可读,这可能就是您使用图例的原因。幸运的是,没有冲突,因为在任何情况下,自然或传统的时间顺序都是从左到右的。在其他问题中,哪个变量在哪个轴上可能更难确定。

    我还建议在

    上玩变体
    graph dot (asis) percent , over(crisis) over(issue) ///
    asyvars marker(1, ms(Oh)) marker(2, ms(X)) marker(3, ms(+)) legend(row(1)) 
    

    我没有在这里展示。在该图中有一个图例,但它更易于使用。

    简而言之,我对移动尴尬图例问题的解决方案是删除它。

    【讨论】: