在 r 中使用 ggplot2 编辑工具提示中的标签以绘制地图
Edit labels in tooltip for plotly maps using ggplot2 in r
我知道这个问题已经被问过很多次,但我认为自从问了这些问题以来,plotly 的一些基本语法已经发生了变化。使用 ggplotly()
创建等值线图会提供默认工具提示,包括经度、纬度、组和我的美学变量之一。我知道工具提示仅映射美学中的内容。我想要做的就是自定义工具提示,以便它显示我的数据集中的一些变量(包括那些未映射到美学的变量)而不是其他变量(例如坐标)。下面是一个可重现的例子,以及我到目前为止所做的尝试。我按照其他问题的回答给出的建议无济于事。
#Load dependencies
library(rgeos)
library(stringr)
library(rgdal)
library(maptools)
library(ggplot2)
library(plotly)
#Function to read shapefile from website
dlshape=function(shploc, shpfile) {
temp=tempfile()
download.file(shploc, temp)
unzip(temp)
shp.data <- sapply(".", function(f) {
fp <- file.path(temp, f)
return(readOGR(".",shpfile))
})
}
austria <- dlshape(shploc="http://biogeo.ucdavis.edu/data/gadm2.8/shp/AUT_adm_shp.zip",
"AUT_adm1")[[1]]
#Create random data to add as variables
austria@data$example1<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
austria@data$example2<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
austria@data$example3<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
#Fortify shapefile to use w/ ggplot
austria.ft <- fortify(austria, region="ID_1")
data<-merge(austria.ft, austria, region="id", by.x = "id", by.y = "ID_1")
#Save as ggplot object
gg<-ggplot(data, aes(x = long, y = lat, fill = example1, group = group)) +
geom_polygon() + geom_path(color="black",linetype=1) +
coord_equal() +
scale_fill_gradient(low = "lightgrey", high = "darkred", name='Index') +xlab("")+ylab("") +
theme(axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank()) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black"))
#Plot using ggplotly
ggplotly(gg)
从这里开始,我尝试了两种不同的方法。最成功的方法之一让我部分地到达了那里。我可以向工具提示添加新变量,但我不能做两件事:1)我无法摆脱默认情况下已经显示的其他变量(从美学角度)和 2)我无法重命名变量,而不是它们的列名数据集(例如我想标记 "example3 as "Example III")。这是该方法:
#Save as a new ggplot object except this time add ``label = example3`` to the aesthetics
gg2<-ggplot(data, aes(x = long, y = lat, fill = example1, group = group, label = example3)) +
geom_polygon() + geom_path(color="black",linetype=1) +
coord_equal() +
scale_fill_gradient(low = "lightgrey", high = "darkred", name='Index') +xlab("")+ylab("") +
theme(axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank()) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black"))
#Save as plotly object then plot
gg2 <- plotly_build(gg2)
gg2
我也尝试添加以下内容,但没有任何作用:
gg2$data[[1]]$text <- paste("Example I:", data$example1, "<br>",
"Example II:", data$example2, "<br>",
"Example III:", data$example3)
非常感谢任何帮助!
更新:我通过从 github 而不是 CRAN 安装更新了 plotly
。使用这个更新版本 (4.0.0) 我已经把它分开了。
gg2$x$data[[2]]$text <- paste("Example I:", data$example1, "<br>",
"Example II:", data$example2, "<br>",
"Example III:", data$example3)
gg2
现在发生的事情让我很困惑。这会添加一个与前一个工具提示分开的额外工具提示。这个新的工具提示正是我想要的,但是它们都出现了——不是同时出现,而是如果我四处移动鼠标。请参阅下面的两个屏幕截图:
注意这些工具提示来自同一个单位(蒂罗尔)。这可能是包中的错误吗?当显示其他图形(例如时间序列而不是地图)时,不会发生这种情况。另请注意,我分配了标签 "Example I"(或 II 或 III),这不会显示在我添加的新工具提示中。
更新#2:我发现旧的工具提示(显示长和纬度)只在悬停在边界上时出现,所以我摆脱了 geom_path(color="black",linetype=1)
命令(关于删除边界)和现在我已经成功地解决了这个问题。但是,我仍然无法修改工具提示中显示的标签。
更新 #3:我想出了如何编辑标签,但只针对一个变量。这太疯狂了!这是我从头到尾的工作流程:
#Load dependencies
library(rgeos)
library(stringr)
library(rgdal)
library(maptools)
library(ggplot2)
library(plotly)
#Function to read shapefile from website
dlshape=function(shploc, shpfile) {
temp=tempfile()
download.file(shploc, temp)
unzip(temp)
shp.data <- sapply(".", function(f) {
fp <- file.path(temp, f)
return(readOGR(".",shpfile))
})
}
austria <- dlshape(shploc="http://biogeo.ucdavis.edu/data/gadm2.8/shp/AUT_adm_shp.zip",
"AUT_adm1")[[1]]
#Create random data to add as variables
austria@data$example1<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
austria@data$example2<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
austria@data$example3<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
#Fortify shapefile to use w/ ggplot
austria.ft <- fortify(austria, region="ID_1")
data<-merge(austria.ft, austria, region="id", by.x = "id", by.y = "ID_1")
#Save as ggplot object
gg<-ggplot(data, aes(x = long, y = lat, fill = example1, group = group, text = paste("Province:", NAME_1))) +
geom_polygon(color="black", size=0.2) +
coord_equal() +
scale_fill_gradient(low = "lightgrey", high = "darkred", name='Index') +xlab("")+ylab("") +
theme(axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank()) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black"))
gg <- plotly_build(gg)
gg
产生以下情节:
请注意 "Province" 现在是大写的(以前不是)。诀窍是在美学中添加 text = paste("Province:", NAME_1)
。但是,当我尝试使用 text2=paste("Example III:", example1)
添加其他标签更改时,会发生以下情况:
请注意,它无法像呈现 text1 那样呈现 text2。因此,我只是尝试添加一个没有 text2 的副本,如下所示:text=paste("Example III:", example1)
- 这会产生以下奇怪的结果:
我开始认为在 plotly 的 ggplot 转换中切换 "legend" 选项这样简单的事情是不可能的。
更新#4:所以我决定用另一种方式来处理这个问题。相反,我决定自己更改变量名称。我会从一开始就这样做,除非我不确定 if/how ggplot2 接受带空格的变量 - 我发现 `variable`
可以工作。所以我继续重新标记变量。它有效-KINDA。问题是文本出现时带有引号。现在我需要一种方法来摆脱这些!!!有什么想法吗?谢谢!这是我在文中引用的意思的图像:
我也是 plotly 的新手,但是在使用 ggplotly()
时我的 ggplot2 气泡图遇到了类似的问题。我终于找到了适合我的解决方案,并且认为它也可能对您有所帮助,尽管我还没有针对等值线图尝试过。
您的第一个问题是自定义工具提示,以便它显示数据集中的一些变量(包括那些未映射到美学的变量)。
在您的更新#3 中,您将:text = paste("Province:", NAME_1)
引入您的 aes。如果要添加第二行自定义变量或文本,只需将其添加到括号中即可:text = paste("Province:", NAME_1, "Example III:", example1)
要在两者之间添加换行符,请在要换行的位置添加 <br>
, 比如:text = paste("Province:", NAME_1, "<br>", "Example III:", example1)
您的第二个问题是自定义工具提示,使其不显示其他(默认)变量(映射到美学,例如坐标)。
我发现 ggplotly()
函数的这个非常简单的添加对我有用:ggplotly(gg, tooltip = c("text"))
在我的例子中,这删除了工具提示中显示的所有默认变量,只显示自定义指定的变量text
以上。您可以通过执行 ggplotly(gg, tooltip = c("text","x"))
添加其他变量。工具提示中显示的变量顺序将与 tooltip
参数中指定的顺序相同。我在这里找到了这个记录:https://github.com/ropensci/plotly/blob/master/R/ggplotly.R
这个解决方案(原则上)对我使用 R 3.1.1 和 plotly 3.4.13 有效
我知道这个问题已经被问过很多次,但我认为自从问了这些问题以来,plotly 的一些基本语法已经发生了变化。使用 ggplotly()
创建等值线图会提供默认工具提示,包括经度、纬度、组和我的美学变量之一。我知道工具提示仅映射美学中的内容。我想要做的就是自定义工具提示,以便它显示我的数据集中的一些变量(包括那些未映射到美学的变量)而不是其他变量(例如坐标)。下面是一个可重现的例子,以及我到目前为止所做的尝试。我按照其他问题的回答给出的建议无济于事。
#Load dependencies
library(rgeos)
library(stringr)
library(rgdal)
library(maptools)
library(ggplot2)
library(plotly)
#Function to read shapefile from website
dlshape=function(shploc, shpfile) {
temp=tempfile()
download.file(shploc, temp)
unzip(temp)
shp.data <- sapply(".", function(f) {
fp <- file.path(temp, f)
return(readOGR(".",shpfile))
})
}
austria <- dlshape(shploc="http://biogeo.ucdavis.edu/data/gadm2.8/shp/AUT_adm_shp.zip",
"AUT_adm1")[[1]]
#Create random data to add as variables
austria@data$example1<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
austria@data$example2<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
austria@data$example3<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
#Fortify shapefile to use w/ ggplot
austria.ft <- fortify(austria, region="ID_1")
data<-merge(austria.ft, austria, region="id", by.x = "id", by.y = "ID_1")
#Save as ggplot object
gg<-ggplot(data, aes(x = long, y = lat, fill = example1, group = group)) +
geom_polygon() + geom_path(color="black",linetype=1) +
coord_equal() +
scale_fill_gradient(low = "lightgrey", high = "darkred", name='Index') +xlab("")+ylab("") +
theme(axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank()) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black"))
#Plot using ggplotly
ggplotly(gg)
从这里开始,我尝试了两种不同的方法。最成功的方法之一让我部分地到达了那里。我可以向工具提示添加新变量,但我不能做两件事:1)我无法摆脱默认情况下已经显示的其他变量(从美学角度)和 2)我无法重命名变量,而不是它们的列名数据集(例如我想标记 "example3 as "Example III")。这是该方法:
#Save as a new ggplot object except this time add ``label = example3`` to the aesthetics
gg2<-ggplot(data, aes(x = long, y = lat, fill = example1, group = group, label = example3)) +
geom_polygon() + geom_path(color="black",linetype=1) +
coord_equal() +
scale_fill_gradient(low = "lightgrey", high = "darkred", name='Index') +xlab("")+ylab("") +
theme(axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank()) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black"))
#Save as plotly object then plot
gg2 <- plotly_build(gg2)
gg2
我也尝试添加以下内容,但没有任何作用:
gg2$data[[1]]$text <- paste("Example I:", data$example1, "<br>",
"Example II:", data$example2, "<br>",
"Example III:", data$example3)
非常感谢任何帮助!
更新:我通过从 github 而不是 CRAN 安装更新了 plotly
。使用这个更新版本 (4.0.0) 我已经把它分开了。
gg2$x$data[[2]]$text <- paste("Example I:", data$example1, "<br>",
"Example II:", data$example2, "<br>",
"Example III:", data$example3)
gg2
现在发生的事情让我很困惑。这会添加一个与前一个工具提示分开的额外工具提示。这个新的工具提示正是我想要的,但是它们都出现了——不是同时出现,而是如果我四处移动鼠标。请参阅下面的两个屏幕截图:
注意这些工具提示来自同一个单位(蒂罗尔)。这可能是包中的错误吗?当显示其他图形(例如时间序列而不是地图)时,不会发生这种情况。另请注意,我分配了标签 "Example I"(或 II 或 III),这不会显示在我添加的新工具提示中。
更新#2:我发现旧的工具提示(显示长和纬度)只在悬停在边界上时出现,所以我摆脱了 geom_path(color="black",linetype=1)
命令(关于删除边界)和现在我已经成功地解决了这个问题。但是,我仍然无法修改工具提示中显示的标签。
更新 #3:我想出了如何编辑标签,但只针对一个变量。这太疯狂了!这是我从头到尾的工作流程:
#Load dependencies
library(rgeos)
library(stringr)
library(rgdal)
library(maptools)
library(ggplot2)
library(plotly)
#Function to read shapefile from website
dlshape=function(shploc, shpfile) {
temp=tempfile()
download.file(shploc, temp)
unzip(temp)
shp.data <- sapply(".", function(f) {
fp <- file.path(temp, f)
return(readOGR(".",shpfile))
})
}
austria <- dlshape(shploc="http://biogeo.ucdavis.edu/data/gadm2.8/shp/AUT_adm_shp.zip",
"AUT_adm1")[[1]]
#Create random data to add as variables
austria@data$example1<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
austria@data$example2<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
austria@data$example3<-sample(seq(from = 1, to = 100, by = 1), size = 11, replace = TRUE)
#Fortify shapefile to use w/ ggplot
austria.ft <- fortify(austria, region="ID_1")
data<-merge(austria.ft, austria, region="id", by.x = "id", by.y = "ID_1")
#Save as ggplot object
gg<-ggplot(data, aes(x = long, y = lat, fill = example1, group = group, text = paste("Province:", NAME_1))) +
geom_polygon(color="black", size=0.2) +
coord_equal() +
scale_fill_gradient(low = "lightgrey", high = "darkred", name='Index') +xlab("")+ylab("") +
theme(axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank()) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black")) +
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.background = element_blank(), axis.line = element_line(colour = "black"))
gg <- plotly_build(gg)
gg
产生以下情节:
请注意 "Province" 现在是大写的(以前不是)。诀窍是在美学中添加 text = paste("Province:", NAME_1)
。但是,当我尝试使用 text2=paste("Example III:", example1)
添加其他标签更改时,会发生以下情况:
请注意,它无法像呈现 text1 那样呈现 text2。因此,我只是尝试添加一个没有 text2 的副本,如下所示:text=paste("Example III:", example1)
- 这会产生以下奇怪的结果:
我开始认为在 plotly 的 ggplot 转换中切换 "legend" 选项这样简单的事情是不可能的。
更新#4:所以我决定用另一种方式来处理这个问题。相反,我决定自己更改变量名称。我会从一开始就这样做,除非我不确定 if/how ggplot2 接受带空格的变量 - 我发现 `variable`
可以工作。所以我继续重新标记变量。它有效-KINDA。问题是文本出现时带有引号。现在我需要一种方法来摆脱这些!!!有什么想法吗?谢谢!这是我在文中引用的意思的图像:
我也是 plotly 的新手,但是在使用 ggplotly()
时我的 ggplot2 气泡图遇到了类似的问题。我终于找到了适合我的解决方案,并且认为它也可能对您有所帮助,尽管我还没有针对等值线图尝试过。
您的第一个问题是自定义工具提示,以便它显示数据集中的一些变量(包括那些未映射到美学的变量)。
在您的更新#3 中,您将:text = paste("Province:", NAME_1)
引入您的 aes。如果要添加第二行自定义变量或文本,只需将其添加到括号中即可:text = paste("Province:", NAME_1, "Example III:", example1)
要在两者之间添加换行符,请在要换行的位置添加 <br>
, 比如:text = paste("Province:", NAME_1, "<br>", "Example III:", example1)
您的第二个问题是自定义工具提示,使其不显示其他(默认)变量(映射到美学,例如坐标)。
我发现 ggplotly()
函数的这个非常简单的添加对我有用:ggplotly(gg, tooltip = c("text"))
在我的例子中,这删除了工具提示中显示的所有默认变量,只显示自定义指定的变量text
以上。您可以通过执行 ggplotly(gg, tooltip = c("text","x"))
添加其他变量。工具提示中显示的变量顺序将与 tooltip
参数中指定的顺序相同。我在这里找到了这个记录:https://github.com/ropensci/plotly/blob/master/R/ggplotly.R
这个解决方案(原则上)对我使用 R 3.1.1 和 plotly 3.4.13 有效