在ggplot2中为每个分面图的行更改y轴限制

9
我有一个3行5列的多图展示。每一行显示的数据范围不同。为了正常展示数据,我没有设置y轴限制。
以下是我的代码:
require(reshape2)
library(ggplot2)
library(RColorBrewer)

fileName = paste("./data_test.csv", sep = "")

## data available here: https://dl.dropboxusercontent.com/u/73950/data_test.csv

mydata = read.csv(fileName,sep=",", header=TRUE)

dataM = melt(mydata,c("id"))
dataM = cbind(dataM,
            colsplit(dataM$variable,
                     pattern = "_",
                     names = c("Network_model", "order", "category")))
dataM$variable <- NULL
dataM <- dcast(dataM, ... ~ category, value.var = "value")
dataM$minCut <- NULL
dataM$nbr_communities <- NULL
dataM$mean_community_size <- NULL
dataM$density <- NULL

my_palette <- colorRampPalette(rev(brewer.pal(11, "Spectral")))

dataM = melt(dataM, id.vars = c("Network_model", "order", "nodesRemoved", "id"))

my_palette = c(brewer.pal(5, "Blues")[c(4)], brewer.pal(5, "Set1")[c(3)])

ggplot(dataM, aes(x= nodesRemoved ,y= value, group= order, color= order)) +
  geom_point(size = .6,alpha = .15,position="jitter") +  ## increased size
  stat_smooth(se = FALSE, size = .5, alpha = .1, method = "loess") +
  scale_color_manual(values=my_palette) +
  theme_bw() +
  theme(plot.background = element_blank(),
        axis.line = element_blank(),
        legend.key = element_blank(),
        legend.title = element_blank(),
        axis.text.x = element_text(size = 8),
        axis.text.y = element_text(size = 8)
        ) +
  scale_y_continuous("Value") + 
  scale_x_continuous("Time", limits=c(0, 100)) +

  facet_grid(variable ~ Network_model,scales="free")

这将产生以下结果:

enter image description here

现在,我想有选择性地为三个行中的每个行设置限制,使得第一行的限制为c(1.9, 3),第二行的限制为c(0, 1) ,第三行的限制为c(.3, .7)。

如何在ggplot2或分面图中实现这一点?


1
这可能通过面板实现,但并不容易。如果我是你,我会为每一行创建三个ggplots。然后,你可以以传统方式设置y轴限制,然后使用grid.arrange将行粘合在一起。(我怀疑除非你制作一个可重复的示例,否则你不会得到任何包含代码的答案。) - Gregor Thomas
2
虽然,如果您对ggplot设置限制感到满意,请尝试使用scales = "free_y",而不是scales = "free"。没有看到您的数据,无法猜测这是否是您要寻找的内容。 - Gregor Thomas
谢谢Gregor,我添加了数据集和完整的代码!干杯! - Lucien S.
你也试过我的建议解决方案,看看它们是否适用于你吗? - Gregor Thomas
scales = "free_y" 据我所知并没有改变任何东西。而且我也不确定如何尝试你的第一个解决方案。不过看起来这正是我需要的! - Lucien S.
1个回答

2

我认为您最好的选择是在绘图之前对数据进行修剪,例如使用dplyr。

library(dplyr)
limits <- data.frame(variable = levels(dataM$variable),
                     min = c(1.9,0,0.3),
                     max = c(3,1,0.7))
dataC <- inner_join(dataM, limits) %>% filter(value > min, value < max)

last_plot() %+% dataC

在此输入图片描述

(我最初将点的大小调大,以便更清楚地看到它们)


当然,缺点是像在图表上拟合LOESS曲线等计算将受到数据子集的影响。 - Björn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接