制作箱形图时如何解决美学长度错误

时间:2020-04-20 14:16:23

标签: ggplot2 boxplot

我正在从df下面制作一个箱线图(对不起,如果这是发布数据框的错误方法,我只是复制并粘贴了dput函数的输出)。我已使用此代码制作箱形图:

IPC_15 <- tidyr::pivot_longer(Income_percap_15, -c("State", "Counties"), names_to = "Income_Per_Capita", values_to = "num") %>% 
  ggplot(aes(x="", y = Income_percap_15)) + 


geom_boxplot() + coord_cartesian(ylim = c(0, 52))
IPC_15 + labs(x = "State",
                y = "Income per Capita",
                title = "US Income per capita per state")

但是我不断收到错误消息“美学必须为长度1或与数据(52)相同:y”。

有什么办法解决这个问题吗?

structure(list(State = structure(1:52,.Label = c(“ Alabama”, “阿拉斯加”,“亚利桑那”,“阿肯色州”,“加利福尼亚”,“科罗拉多州”,“康涅狄格州”, “特拉华州”,“哥伦比亚特区”,“佛罗里达州”,“乔治亚州”,“夏威夷州”, “爱达荷州”,“伊利诺伊州”,“印第安纳州”,“爱荷华州”,“堪萨斯州”,“肯塔基州”, “路易斯安那州”,“缅因州”,“马里兰州”,“马萨诸塞州”,“密歇根州”, “明尼苏达州”,“密西西比州”,“密苏里州”,“蒙大拿州”,“内布拉斯加州”, “内华达州”,“新罕布什尔州”,“新泽西州”,“新墨西哥州”,“纽约州”, “北卡罗来纳州”,“北达科他州”,“俄亥俄州”,“俄克拉荷马州”,“俄勒冈州”, “宾夕法尼亚州”,“波多黎各”,“罗德岛”,“南卡罗来纳州”, “南达科他州”,“田纳西州”,“德克萨斯州”,“犹他州”,“佛蒙特州”,“弗吉尼亚州”, “华盛顿”,“西弗吉尼亚州”,“威斯康星州”,“怀俄明州”),类=“因子”), 县= c(67L,29L,15L,75L,58L,64L,8L,3L,1L,67L, 159L,5L,44L,102L,92L,99L,105L,120L,64L,16L,24L, 14L,83L,87L,82L,115L,56L,93L,17L,10L,21L,33L,62L, 100L,53L,88L,77L,36L,67L,78L,5L,46L,66L,95L,254L, 29L,14L,133L,39L,55L,72L,23L),Income_15 = c(20780.9402985075, 30332.9655172414、21052.5333333333、20072.0266666667、27902.6034482759, 27747.25、37025.125、28952、47675、23501.8507462687、20566.0062893082, 31892.6、21451.1136363636、25485.7156862745、23977.0652173913, 26555.8686868687、24953.0476190476、20663.6083333333、22064.609375, 25792.3125、33073.2083333333、35554.4285714286、23662.2048192771, 27610.4252873563、18805.0487804878、21504.7826086957、25020.6785714286, 26336.8494623656、26317.7058823529、31810.4、36084.5238095238, 21789.4545454545、28189.7580645161、22514.36、31900.5094339623, 24467.7727272727、22811.8701298701、24311.9166666667、25952.223880597, 9617.66666666667、35670.6、21411.9565217391、25334.8939393939, 21442.4210526316,23551.7992125984,22552.2413793103,28487.2142857143, 27065.3909774436,25734.4102564103,21710.4181818182,26250.7222222222, 29223.652173913)),row.names = c(NA,-52L),class =“ data.frame”)

1 个答案:

答案 0 :(得分:1)

由于有很多评论希望对您有所帮助,因此该解决方案包含多个部分。我将尝试相应地安排要点:

错误消息的文字和含义

您的错误消息“美学必须为长度1或与数据(52):y”相同,表示aes()属性之一未映射数据集中的所有点。最后的描述根据在您的数据集中的一种美学或观察值的映射中找到的内容,为您提供了“应该”为(52)的数字。您的数据框中有52行,因此这意味着这些美感之一无法正确映射。您可以使用""进行美学映射,这基本上意味着“将整个数据帧映射为一个”。似乎该错误专门与y=Income_percap_15有关。在您进行pivot_longer调用之后,没有名称相同的列。我认为您想在那里使用y=num

预期的美学和您打算的情节

您的代码具有表示x=""y="Income_percap_15"的美感,这表示您希望针对整个数据集显示一个箱线图 。但是,您的labs()呼叫表明您希望显示每个州的箱线图。虽然您可以显示整个数据集的“单个箱线图”(aes(x="",...)),但是您的数据将无法为您显示每种状态的箱线图。箱线图表示数据,这意味着每个“ x”值都需要多个“ y”点。在数据框中,每个“ x”(州)只有一个“ y”值(人均收入)。

Kinda有问题的限制

您设置的限制(0到52)将应用于y美学。 y美学似乎打算映射到人均收入。在pivot_longer调用之后的数据框中,将是“ num”列,其最小值为9618,最大值为47675-显然超出了您设置的限制。这意味着您将看到一个空的情节。如果您希望将此方法应用于x美学(52个州),我认为这是您的意图,那么此处就不需要-您只需要指定正确的美学即可。由于您已指示将此限制应用于y轴,所以我在这里假设您正在寻找水平排列的箱形图。为此,您正在“翻转”轴,该轴将为coord_flip()

最终情节?

好吧,我希望我有更好的消息,但是如上所述,使用您拥有的数据似乎无法实现预期的箱线图。要“修复”代码以显示箱线图(即使不可能),请参见下面的内容。注意,结果“箱线图”显示每个状态的行,因为对于每个状态,n = 1。因此,“分布”实际上不是分布。注意:这里假设df是您的数据帧 pivot_longer调用后

ggplot(data=df, aes(x=State, y = num)) +
    geom_boxplot() +
    coord_flip() +
    labs(y='Income per capita', title="US Income per capita per state") +
    theme(
        axis.text.y=element_text(size=7, vjust=0.3),
        plot.title=element_text(size=9)
    )

enter image description here

实际上,在这里显示“线条”而不是“方框”看起来并不算太糟,但是您当然可以绘制相同的图并使用geom_point甚至geom_segment来给您显示“线条”外观,尽管更干净。有关情节的其他说明:

  • theme()应用于y轴,而labs()应用于显示的反轴。 Coord_flip()意味着您的标签美感被应用于反向轴,但是主题通常设置在coord_cartesian调用之外。

  • 其他特定主题元素使其显得合适

  • 保存或查看时,由于绘图为“长”,因此应使用或保存支持该纵横比的宽高比,否则y轴值将显示为“压缩”。我认为这里的宽高比是1:2。

  • vjust中的theme()用于调整标签在“状态”轴上相对于文本的垂直位置。默认情况下,刻度线的位置要与文本垂直居中...但是,当您使用大写字母和小写字母时,根据我们希望它的外观,垂直居中位置实际上有点太高。即使标签实际上是垂直居中,这也会微调所有标签以纠正显示为非居中的效果。