我正在尝试用ggplot创建一个方格图,并巧妙地使用dataset airquality,其中Month位于x轴上,Ozone值位于y轴上。我的目的是注释这个图,以便当我悬停在离群点上时,除了臭氧值之外,它还应该显示Sample名称:
library(tidyverse)
library(plotly)
library(datasets)
data(airquality)
# add months
airquality$Month <- factor(airquality$Month,
labels = c("May", "Jun", "Jul", "Aug", "Sep"))
# add sample names
airquality$Sample <- paste0('Sample_',seq(1:nrow(airquality)))
# boxplot
p <- ggplot(airquality, aes(x = Month, y = Ozone)) +
geom_boxplot()
p <- plotly_build(p)
p下面是创建的情节:

默认情况下,当我悬停在每个框上时,它会显示x轴变量的基本汇总状态。然而,我也想看到的是异常点样本是什么。例如,在五月上空徘徊时,它显示异常值115,但它并不表示它实际上是Sample_30。
如何将样本变量添加到异常点,以便同时显示异常值和示例名称?
发布于 2020-02-05 14:30:47
此方法将获得相同的结果,但不显示框图摘要统计值悬停。移除盒图层上的离群点和悬停,并用悬停信息覆盖只包含异常值的geom_point层。文中给出了这里中孤立点的定义。当处理更复杂的图形时,这种方法比其他解决方案工作得更好(例如,并排排列方框图)。有趣的是,用于此数据的ggplot方格图与ggplot图并不相同。8月上边的篱笆须比8月的上栅栏须延展得更远。
library(dplyr)
library(plotly)
library(datasets)
library(ggplot2)
data(airquality)
# manipulate data
mydata = airquality %>%
# add months
mutate(Month = factor(airquality$Month,labels = c("May", "Jun", "Jul", "Aug", "Sep")),
# add sample names
Sample = paste0('Sample_',seq(1:n())))%>%
# label if outlier sample by Month
group_by(Month) %>%
mutate(OutlierFlag = ifelse((Ozone<quantile(Ozone,1/3,na.rm=T)-1.5*IQR(Ozone,na.rm=T)) | (Ozone>quantile(Ozone,2/3,na.rm=T)+1.5*IQR(Ozone,na.rm=T)),'Outlier','NotOutlier'))%>%
group_by()
# boxplot
p <- ggplot(mydata, aes(x = Month, y = Ozone)) +
geom_boxplot()+
geom_point(data=mydata %>% filter(OutlierFlag=="Outlier"),aes(group=Month,label1=Sample,label2=Ozone),size=2)
output = ggplotly(p, tooltip=c("label1","label2"))
# makes boxplot outliers invisible and hover info off
for (i in 1:length(output$x$data)){
if (output$x$data[[i]]$type=="box"){
output$x$data[[i]]$marker$opacity = 0
output$x$data[[i]]$hoverinfo = "none"
}
}
# print end result of plotly graph
output

https://stackoverflow.com/questions/47518245
复制相似问题