【发布时间】:2016-06-15 22:29:13
【问题描述】:
鉴于以下数据:
# Import mock data
Biomass <- c(20, 10, 5, 4, 5, 7, 8, 22, 13, 13, 15, 18, 2, 5, 7, 10)
Season <- c("Winter", "Spring", "Summer", "Fall")
Year <- c("1", "2", "3", "4")
ReefSpecies <- c("Admiral Ma", "Jaap Mf", "Grecian Ma", "Alligator Mr", "Jaap Mf", "Grecian Ma", "Alligator Mr", "Admiral Ma", "Grecian Ma", "Alligator Mr", "Admiral Ma", "Jaap Mf", "Alligator Mr", "Admiral Ma", "Jaap Mf","Grecian Ma")
Seasonal <- data.frame(Biomass, Season, Year, ReefSpecies)
Seasonal$Times <- paste(Seasonal$Year, Seasonal$Season, sep=" ")
Seasonal$Time <- factor(Seasonal$Times, levels=unique(Seasonal$Times))
# Plot figure
ggplot(data = Seasonal, aes(Time, Biomass, color=ReefSpecies)) +
geom_point() +
geom_smooth(aes(group=ReefSpecies), method="lm") +
theme(axis.text.x = element_text(angle = 270)) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_rect(colour="black", size=1, fill=NA), axis.line = element_line(colour = "black")) +
theme(legend.position = "top") +
xlab("Year") +
ylab(bquote("Ash-free Biomass (mg/cm"^"2"*")"))
我想制作一个分别添加每个物种的 3 个数字。 例如,我们在四个珊瑚礁上拥有三个物种(Admiral Ma 和 Grecian Ma - 1 个物种和 2 个珊瑚礁,Jaap Mf - 1 个物种和 1 个珊瑚礁,以及鳄鱼先生 - 1 个物种和 1 个珊瑚礁)。 我想要的是首先将 Reef Ma 添加到情节中 - 这将是第一个数字。
接下来我想添加另一个物种(比如)Reef Mf,其中包括上一个图 - 这将是第二个图。
由于最后一个图包含了所有数据,我知道该怎么做 - 只需要前两个数字的帮助。
下面附上的是我已经能够实现的图像 - 您会看到使用此方法并非包含所有数据点(与一个图中所有数据的其他图像相比) - 两个图的代码都附加为嗯。
注意:上面的数据是下面绘制的一小部分
#Subsetted dataset with missing points
ggplot(subset(Seasonal, ReefSpecies == c("Grecian O. faveolata", "Jaap O. faveolata", "Alligator O. faveolata", "Admiral O. faveolata")),
aes(Time, Biomass, color = ReefSpecies)) +
geom_point() +
geom_smooth(aes(group=ReefSpecies), method="lm") +
theme(axis.text.x = element_text(angle = 270)) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_rect(colour="black", size=1, fill=NA), axis.line = element_line(colour = "black")) +
theme(legend.position = "top") +
xlab("Year") +
ylab(bquote("Ash-free Biomass (mg/cm"^"2"*")"))
这是我想要的第一个图的示例 - 它包括所有相同的物种,但也来自我的所有研究地点。
此外,我收到此警告消息 - 我认为这意味着它正在尝试为子集绘制相同数量的点,但 R 警告对我来说几乎是一门外语。
Warning message:
In ReefSpecies == c("Grecian O. faveolata", "Jaap O. faveolata", :
longer object length is not a multiple of shorter object length
ggplot(subset(Seasonal, ReefSpecies == c("Grecian O. faveolata", "Jaap O. faveolata", "Alligator O. faveolata", "Admiral O. faveolata", "Grecian O. annularis", "Jaap O. annularis", "Alligator O. annularis", "Admiral O. annularis")),
aes(Time, Biomass, color = ReefSpecies)) +
geom_point() +
geom_smooth(aes(group=ReefSpecies), method="lm") +
theme(axis.text.x = element_text(angle = 270)) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_rect(colour="black", size=1, fill=NA), axis.line = element_line(colour = "black")) +
theme(legend.position = "top") +
xlab("Year") +
ylab(bquote("Ash-free Biomass (mg/cm"^"2"*")"))
这是我想要的第一个图的示例 - 它包括所有相同的物种,但也来自我的所有研究地点。
同样的警告信息也出现在这个情节中
注意:子集图中的红线对应整个数据图中的金线
子集图中的蓝线对应整个数据图中的蓝线
子集图中的绿线对应整个数据图中的绿线
子集图中的紫色线对应整个数据图中的紫色线
# Whole Dataset
ggplot(data = Seasonal, aes(Time, Biomass, color=ReefSpecies)) +
geom_point() +
geom_smooth(aes(group=ReefSpecies), method="lm") +
theme(axis.text.x = element_text(angle = 270)) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_rect(colour="black", size=1, fill=NA), axis.line = element_line(colour = "black")) +
theme(legend.position = "top") +
xlab("Year") +
ylab(bquote("Ash-free Biomass (mg/cm"^"2"*")"))
从这两个图中可以看出 - ggplot 在绘制子集时似乎删除了图中的多个点。
任何帮助将不胜感激,如果您需要我提供更多帮助,请告诉我,并提前感谢您!
【问题讨论】:
-
在
subset条件中使用%in%而不是==来检查ReefSpecies是否与指定的任何名称匹配。 -
@MikkoMarttila 我试过了,但它说找不到函数,我收到这个错误
Error in eval(expr, envir, enclos) : could not find function "%n%" -
@MikkoMarttila 忽略最后一条评论 - 这确实有效!谢谢!我需要尝试
%in%而不是%n% -
作为对未来的一点建议 - 在解决问题之前先缩小范围。这根本不是
ggplot问题,也不是绘图问题。这是一个如何对数据进行子集化的问题。如果您看到一个看起来错误的图,您应该做的第一件事是检查您提供给该图的数据框是否正确。在这种情况下,情况并非如此,而且您已将问题缩小到一行代码。 -
见difference between
%in%VS==。它们完全不同。使您的子集与==一起工作的方法是subset(Seasonal, ReefSpecies == "Gregcian O. faveolata" | ReefSpecies = "Jaap O. faveolata" | ReefSpecies == ...)。