在ggplot条形图中,使Y轴从1而不是0开始

时间:2018-12-19 01:02:39

标签: r ggplot2

我有一些调查数据,人们回答了他们对不同陈述的强烈同意,同意,不同意和强烈不同意。他们的响应可以是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"))

chart

这接近我的需要,但是我真的很想使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))

1 个答案:

答案 0 :(得分:3)

try { sensorReadings.get(startIndex); int minIndex = 0; startIndex = -1; endIndex = 18; for (int i = startIndex; i < sensorReadings.size(); i++) { if (i >= startIndex && i <= endIndex) { if (this.sensorReadings.get(minIndex).getValue() < this.sensorReadings.get(i).getValue()) minIndex = i; } } return minIndex; } catch(IndexOutOfBoundsException exception) { handleTheExceptionSomehow(exception); //Program should continue just fine } 可以通过在有限的区域上进行绘制同时保留数据来完成工作:

1

如果您在coord_cartesian()中使用limits =调用,则情节将会中断。

代码

scale_y_continuous()