绘制一个图,其中条形的高度和宽度有所不同,但不会聚集

问题描述 投票:0回答:1

对于 2020 年美国总统选举,我正在尝试制作一个条形图,通过条形颜色指示哪个政党赢得了该州,通过条形高度表示胜利的幅度是多少,以及该州赢得的选举人票数由条形的宽度决定。当我使用 geom_bar (或 geom_col)时,一些条形聚集在一起,并且偏离了各自状态的刻度线。

我希望条形图以刻度线为中心,并且条形图之间的空白最小。我尝试了各种闪避设置,但没有任何尝试可以解决此问题。将选举团变量 (EC) 除以较大的数字会有所帮助,尽管这远非理想,因为您会失去每个州对胜利贡献程度之间的更多差异。

这是可重现示例的代码:

library(tidyverse)

## state abbreviation

st  <- c("AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "DC", "FL",
         "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME",
         "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH",
         "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI",
         "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI",
         "WY")

## two-party vote share for Biden

demvs  <- c(0.371, 0.447, 0.502, 0.358, 0.649, 0.569, 0.602, 0.596,
            0.945, 0.483, 0.501, 0.65, 0.341, 0.587, 0.418, 0.458,
            0.425, 0.368, 0.405, 0.547, 0.67, 0.671, 0.514, 0.536,
            0.416, 0.422, 0.416, 0.402, 0.512, 0.537, 0.581, 0.555,
            0.617, 0.493, 0.328, 0.459, 0.331, 0.583, 0.506, 0.606,
            0.441, 0.366, 0.382, 0.472, 0.393, 0.683, 0.552, 0.599,
            0.302, 0.503, 0.275)

## party that won the state

ptywon  <- c("R", "R", "D", "R", "D", "D", "D", "D", "D", "R", "D",
             "D", "R", "D", "R", "R", "R", "R", "R", "D", "D", "D",
             "D", "D", "R", "R", "R", "R", "D", "D", "D", "D", "D",
             "R", "R", "R", "R", "D", "D", "D", "R", "R", "R", "R",
             "R", "D", "D", "D", "R", "D", "R")

## margin of victory

marg  <- c(0.258, 0.105, 0.003, 0.284, 0.298, 0.139, 0.204, 0.193,
           0.889, 0.034, 0.002, 0.301, 0.318, 0.173, 0.164, 0.084,
           0.15, 0.264, 0.189, 0.093, 0.341, 0.342, 0.028, 0.073,
           0.168, 0.157, 0.168, 0.196, 0.024, 0.075, 0.161, 0.11,
           0.234, 0.014, 0.344, 0.082, 0.339, 0.166, 0.012, 0.212,
           0.119, 0.269, 0.237, 0.057, 0.214, 0.366, 0.103, 0.199,
           0.396, 0.006, 0.45)

## number of electoral college votes for a state

EC  <- c(9, 3, 11, 6, 55, 9, 7, 3, 3, 29, 16, 4, 4, 20, 11, 6, 6, 8,
         8, 4, 10, 11, 16, 10, 6, 10, 3, 5, 6, 4, 14, 5, 29, 15, 3,
         18, 7, 7, 20, 4, 9, 3, 11, 38, 6, 3, 13, 12, 5, 10, 3)

df  <- data.frame(st,demvs,ptywon,marg)

## barplot indicating which party won the state by color, what the
## margin was, and the number of electoral votes for the state

ggplot(df, aes(x=reorder(st,-demvs),y=marg,fill=ptywon,
                      width=EC/10)) +
    geom_bar(stat="identity",position="dodge2") +
    scale_fill_manual(values=c("blue2", "red3")) +
    theme_minimal()  +
    labs(x="State",y="Margin of victory",fill="Winning party") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1),
          legend.position="top")

ggplot2 geom-bar position-dodge
1个回答
0
投票

这就是你所追求的吗?

ggplot(df, aes(x=factor(tmp), width= EC/55, y=marg,fill=ptywon)) +
    geom_col() +
    scale_fill_manual(values=c("blue2", "red3")) +
    theme_minimal()  +
    labs(x="State",y="Margin of victory",fill="Winning party") +
    theme(axis.text.x = element_text(angle = 45, hjust = 1),
          legend.position="top")
© www.soinside.com 2019 - 2024. All rights reserved.