r - 绘制具有数据子集的图层时,因子水平的顺序会发生变化

标签 r plot ggplot2

我正在尝试控制 R 中 ggplot2 图中图例中项目的顺序。我查找了其他一些类似的问题,并发现了如何更改因子变量级别的顺序我正在密谋。我正在绘制 12 月、1 月、7 月和 6 月 4 个月的数据。

如果我只对所有月份执行一个绘图命令,它会按预期工作,图例中排序的月份按因子级别的顺序出现。但是,我需要为夏季(六月和七月)和冬季(十二月和一月)数据设置不同的 dodge 值。我使用两个 geom_pointrange 命令来完成此操作。当我将其分为两步时,图例的顺序又回到字母顺序。您可以通过注释掉“plot Summer”或“plot Winter”命令来进行演示。

我可以更改什么来保持图例中的因子级别顺序?

请忽略看起来奇怪的测试数据 - 真实数据在这种绘图格式中看起来很好。

#testdata
hour <- rep(seq(from=1,to=24,by=1),4)
avg_hou <- sample(seq(0,0.5,0.001),96,replace=TRUE)
lower_ci <- avg_hou - sample(seq(0,0.05,0.001),96,replace=TRUE)
upper_ci <- avg_hou + sample(seq(0,0.05,0.001),96,replace=TRUE)
Month <- c(rep("December",24), rep("January",24), rep("June",24), rep("July",24))

testdata <- data.frame(Month,hour,avg_hou,lower_ci,upper_ci)
testdata$Month <- factor(alldata$Month,levels=c("June", "July", "December","January"))

#basic plot setup
plotx <- ggplot(testdata, aes(x = hour, y = avg_hou, ymin = lower_ci, ymax = upper_ci, color = Month, shape = Month))
plotx <- plotx + scale_color_manual(values = c("June" = "#FDB863", "July" = "#E66101",  "December" = "#92C5DE", "January" = "#0571B0"))

#plot summer
plotx  <- plotx + geom_pointrange(data = testdata[testdata$Month == "June" | testdata$Month == "July",], size = 1, position=position_dodge(width=0.3)) 
#plot winter
plotx  <- plotx + geom_pointrange(data = testdata[testdata$Month == "December" | testdata$Month == "January",], size = 1, position=position_dodge(width=0.6))

print(plotx)

最佳答案

一种可能性是添加一个geom_blank作为图中的第一层。来自 ?geom_blank:“空白几何图形不绘制任何内容,但可以是确保不同绘图之间通用比例的有用方法。”。我们告诉 geom_blank 层使用整个数据集。因此,该层设置了一个比例尺,其中包括正确排序的所有级别的“月”。然后添加两层 geom_pointrange,每层都使用数据的子集。

在这种特殊情况下,可能是个人喜好问题,但我倾向于在 ggplot 中使用数据集之前先准备好数据集。

df_sum <- testdata[testdata$Month %in% c("June", "July"), ]
df_win <- testdata[testdata$Month %in% c("December", "January"), ]

ggplot(data = testdata, aes(x = hour, y = avg_hou, ymin = lower_ci, ymax = upper_ci,
       color = Month, shape = Month)) +
  geom_blank() +
  geom_pointrange(data = df_sum, size = 1, position = position_dodge(width = 0.3)) +
  geom_pointrange(data = df_win, size = 1, position = position_dodge(width = 0.6)) +
  scale_color_manual(values = c("June" = "#FDB863", "July" = "#E66101",
                     "December" = "#92C5DE", "January" = "#0571B0"))

enter image description here

关于r - 绘制具有数据子集的图层时,因子水平的顺序会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20387516/

相关文章:

r - lmer 错误 : grouping factor must be < number of observations

创建包时的R环境问题

r - 粘贴是绘图数学表达式中的特殊参数吗?

r - show()、hide() 使用来自 Shinyjs、Shiny

r - Ggplot2:geom_text() 在绘图中添加了额外的、不需要的值

r - 在R中绘制巨大的数据文件?

python - 使用 matplotlib.pyplot.plot 用虚线绘制图像

python - 如何在 matplotlib 的折线图上绘制最大值点?

r - 如果矩阵而不是数据框,则 R 绘图中的标记点不打印

r - R 中的判别分析(FDA 和 MDA)图