【问题标题】:Make Y-axis start at 1 instead of 0 within ggplot bar chart在ggplot条形图中使Y轴从1而不是0开始
【发布时间】:2018-12-19 01:02:38
【问题描述】:

我有一些调查数据,人们回答了他们对不同陈述的强烈同意、同意、不同意、强烈不同意的程度。他们的回答可以是 1 到 4 之间的任何值(包括小数)(1 = 非常不同意,2 = 不同意,等等...)。

我想通过在条形图中绘制每个变量的平均值来总结这些数据。我还想将 Y 轴标签更改为不是数值,但锚点处的标签 1 = 非常不同意,2 = 不同意,等等...

鉴于下面包含的数据,我可以使用以下代码完成此操作:

ggplot(data = data, aes(x=factor(key), y=value, fill=key)) + 
  stat_summary(fun.y="mean", geom="bar", width = 0.5) +
  stat_summary(aes(label=round(..y..,1)), fun.y="mean", geom="text", vjust = -0.5) +
  geom_hline(yintercept = 3, linetype="solid", color = "red", size=1.5, alpha=0.25) +
  scale_y_discrete(limits=c("Strongly Disagree", "Disagree", "Agree", "Strongly Agree"))

这接近我需要的,但我真的想让 Y 轴从 1 = 强烈反对而不是 0 开始。

我在想我可以从所有数字响应中减去 1,但是我每个条的平均分数标签会不正确。

我唯一的限制是我想在ggplot 内完成这项任务,希望不是通过重塑原始数据。我有另一个这样的图表,我使用facet_wrap() 为我的数据集中的每个组(不包括变量)创建相同的图表。

我进行了很多搜索,但似乎通常不建议更改 ggplot 中轴的起点。但是,鉴于这种情况,它认为这听起来可以接受。


data <- structure(list(key = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L), .Label = c("Clarity", "Appropriateness", "Commitment"
), class = "factor"), value = c(NA, 3.33333333333333, 3.33333333333333, 
4, 4, 3, 4, NA, 3, NA, 3, 4, NA, NaN, 3, 2.66666666666667, 3, 
NA, 3.33333333333333, 3.66666666666667, 3.66666666666667, 4, 
NA, 3, 4, 3.66666666666667, 3, 2.66666666666667, 3, 4, 4, 3, 
3, NaN, 3, 4, 3, 4, 3, 4, 4, 2.33333333333333, 3, 4, 4, 3, 4, 
3, 3, 3.33333333333333, 3, 4, 3, NA, 2.66666666666667, 3.33333333333333, 
4, 2.33333333333333, 3.66666666666667, 4, 4, 3, NA, 3, 4, 3.2, 
4, 3, 4, NA, 3.2, NA, 3, 4, NA, 4, 3, 3.4, 3, NA, 2.8, 3.6, 3.6, 
3.8, NA, 3, 3.4, 3.2, 3, 3, 3.4, 3.8, 3.6, 3, 3, NaN, 2.4, 4, 
3, 3.2, 3.2, 4, 4, 2.6, 3.8, 4, 4, 3.6, 3.2, 3, 3, 4, 2.8, 4, 
3, NA, 3.4, 3.4, 4, 2.6, 3.8, 4, 3.4, 3, NA, 2.33333333333333, 
4, 3.66666666666667, 4, 3, 4, NA, 3.33333333333333, NA, 4, 4, 
NA, 4, 4, 2.33333333333333, 3.66666666666667, NA, 3, 4, 4, 4, 
NA, 3.33333333333333, 3, 4, 3.33333333333333, 3.66666666666667, 
3.33333333333333, 4, 4, 2.33333333333333, 3.66666666666667, NaN, 
3, 4, 3, 3, 4, 3.66666666666667, 4, 3.33333333333333, 4, 3.66666666666667, 
4, 4, 4, 3.66666666666667, 3, 3.33333333333333, 3.66666666666667, 
3.66666666666667, 2.66666666666667, NA, 2.33333333333333, 3, 
4, 3, 3.66666666666667, 4, 4, 4)), class = "data.frame", row.names = c(NA, 
-186L))

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    coord_cartesian() 通过在有限的区域上绘图来完成工作,同时仍然保留数据:

    如果您在scale_y_continuous() 中使用limits = 调用,您的情节就会中断。

    代码

    ggplot(data = data, aes(x = key, y = value, fill = key)) + 
        stat_summary(fun.y = "mean", geom = "bar", width = 0.5) +
        stat_summary(aes(label = round(..y.., 1)), 
                     fun.y="mean", geom="text", vjust = -0.5) +
        geom_hline(yintercept = 3, linetype = "solid", 
                   color = "red", size = 1.5, alpha = 0.25) +
        # limit the vertical space to 1 to 4, but keep the data
        coord_cartesian(ylim = c(1, 4)) +
                           # set ticks at 1, 2, 3, 4
        scale_y_continuous(breaks = c(1:4),
                           # label them with names
                           labels = c("Strongly Disagree", "Disagree",
                                      "Agree", "Strongly Agree"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多