Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使用ggplot2编辑图例的位置_R_Ggplot2_Maps - Fatal编程技术网

R 如何使用ggplot2编辑图例的位置

R 如何使用ggplot2编辑图例的位置,r,ggplot2,maps,R,Ggplot2,Maps,我在用多层的ggplot2图形中分离图例时遇到困难。我的图所做的是根据存在的纺织公司数量填充不同的城市,我还用geom_point绘制工厂本地化。我的猜测是以某种方式使用aes.override(),但我仍然无法做到这一点。我所阅读的解决方案没有针对geom_point()的aes()中详细说明的绘图处理不同的变量 如果你想测试下面的代码,你可以下载巴西城市的shapefile,使用readOGR和fortify,然后选择使用fill填充你的首选城市,并在巴西境内为geom_point()设置任

我在用多层的ggplot2图形中分离图例时遇到困难。我的图所做的是根据存在的纺织公司数量填充不同的城市,我还用
geom_point
绘制工厂本地化。我的猜测是以某种方式使用
aes.override()
,但我仍然无法做到这一点。我所阅读的解决方案没有针对
geom_point()
aes()
中详细说明的绘图处理不同的变量

如果你想测试下面的代码,你可以下载巴西城市的shapefile,使用
readOGR
fortify
,然后选择使用
fill
填充你的首选城市,并在巴西境内为
geom_point()设置任意随机点,创建一个不同的变量,例如下面的
lat\u工厂
long\u工厂
。下面的
region
列详细说明了巴西地区——在本例中,“1”详细说明了巴西北部地区

代码
#设置ggplot
图书馆(GG2)
gg2<-ggplot(数据=out[out$region==“1”,],
不良事件(x=长期,y=横向,集团=集团,填充=公司因素)
几何多边形()
ggtitle(“title”)+
比例-填充-离散(名称=“纺织公司数量”)+
主题(plot.title=元素\文本(大小=30,face=“bold”))+
主题(legend.text=元素\文本(大小=12),
legend.title=元素\文本(color=“blue”,size=16,face=“bold”))
#图形输出
gg2+
几何点(数据=out[out$region==“1”,],aes(x=long\u工厂,y=lat\u工厂),color=“红色”)
作为传奇人物,我得到的是:


我想将其分开,详细说明点作为本地化,颜色作为该地区纺织公司数量的填充。

仅供参考,您发布的下载形状文件的链接相当慢,至少下载到美国计算机上是如此

此链接提供了更好的下载,还显示了如何读取形状数据:

我举了一个例子,使用地区而不是市政数据来保持简单

我使用的数据可在此处下载:

#加载库。
图书馆(rgeos)
图书馆(rgdal)
图书馆(GG2)
#读入并格式化地图数据。

仅供参考,您发布的下载形状文件的链接非常慢,至少下载到美国计算机上是如此

此链接提供了更好的下载,还显示了如何读取形状数据:

我举了一个例子,使用地区而不是市政数据来保持简单

我使用的数据可在此处下载:

#加载库。
图书馆(rgeos)
图书馆(rgdal)
图书馆(GG2)
#读入并格式化地图数据。

我给你留了另一个选择。hmgeiger将纺织公司的数量视为一个因素。但是,我宁愿把这个变量当作一个连续变量。由于没有可复制的数据,我自己创建了一个样本数据。在这里,我创建了巴西经纬度的随机样本,并确保一些数据点留在巴西
whatever2
包含留在巴西的数据点。我在这里也耍了点小把戏。我添加了一个名为
Factory location
的新列。这是用于向最终图形中的数据点添加颜色的虚拟变量。hmgeiger为您创建了包含字符的
Dummy.var
。我宁愿将
留在本专栏中,因为您可能不想在图例中看到任何文本

对于图例问题,正如Antonio和hmgeiger所提到的,您需要在
aes()
中添加颜色。这就解决了问题。我为你做了更多的事。如果你不知道每个城市有多少家工厂,你需要数一数工厂的数量。我使用
GISTools
包中的
poly.count()
完成了这项工作,并创建了另一个数据框,其中包含每个城市的工厂数量

当我画地图时,我有三层。一个用于多边形,另一个用于用颜色填充多边形。它们是通过
ggalt
包中的
geom\u cartogram()
完成的。关键是您需要为
map\u id
设置一个公共键列<第一个
geom\u cartogram()
中的code>id
和第二个
geom\u cartogram()中的
ind
是相同的信息。在
geom_point()
中,您需要在
aes()中使用
color
。图例中有一个连续的条形图表示工厂数量,一个单点表示工厂位置。它旁边没有文本。因此,我认为,这让传说变得整洁

library(raster)
library(tidyverse)
library(GISTools)
library(RColorBrewer)
library(ggalt)
library(ggthemes)

# Get polygon data for Brazil
brazil <- getData("GADM", country = "brazil", level = 1)

mymap <- fortify(brazil)

# Create dummy data staying in the polygons
# For more information: https://stackoverflow.com/questions/47696382/removing-data-outside-country-map-boundary-in-r/47699405#47699405
set.seed(123)
mydata <- data.frame(long = runif(200, min = quantile(mymap$long)[1], max = quantile(mymap$long)[4]),
                     lat = runif(200, min = quantile(mymap$lat)[1], max = quantile(mymap$lat)[4]),
                     factory = paste("factory ", 1:200, sep = ""),
                     stringsAsFactors = FALSE)

spdf <- SpatialPointsDataFrame(coords = mydata[, c("long", "lat")], data = mydata,
                               proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))


whatever <- spdf[!is.na(over(spdf, as(brazil, "SpatialPolygons"))), ]

whatever2 <- as.data.frame(whatever) %>%
             mutate(`Factory location` = "")


# Now I check how many data points (factories) exist in each polygon
# and create a data frame
factory.num <- poly.counts(pts = whatever, polys = brazil)
factory.num <- stack(factory.num)


ggplot() +
geom_cartogram(data = mymap, aes(x = long, y = lat, map_id = id),
               map = mymap) +
geom_cartogram(data = factory.num, aes(fill = values, map_id = ind),
               map = mymap) +
geom_point(data = whatever2, aes(x = long, y = lat, color = `Factory location`)) +
scale_fill_gradientn(name = "Number of factories", colours = brewer.pal(5, "Greens")) +
coord_map() +
theme_map()
库(光栅)
图书馆(tidyverse)
图书馆(GISTools)
图书馆(RColorBrewer)
图书馆(ggalt)
图书馆(主题)
#获取巴西的多边形数据

巴西我留给你另一个选择。hmgeiger将纺织公司的数量视为一个因素。但是,我宁愿把这个变量当作一个连续变量。由于没有可复制的数据,我自己创建了一个样本数据。在这里,我创建了巴西经纬度的随机样本,并确保一些数据点留在巴西
whatever2
包含留在巴西的数据点。我在这里也耍了点小把戏。我添加了一个名为
Factory location
的新列。这是用于向最终图形中的数据点添加颜色的虚拟变量。hmgeiger为您创建了包含字符的
Dummy.var
。我宁愿将
留在本专栏中,因为您可能不想在图例中看到任何文本

对于图例问题,正如Antonio和hmgeiger所提到的,您需要在
aes()
中添加颜色。这就解决了问题。我为你做了更多的事。如果你不知道每个工厂有多少家
#Load libraries.

library(rgeos)
library(rgdal)
library(ggplot2)

#Read in and format map data.

regions_OGR <- readOGR(dsn="/Users/hmgeiger/Downloads/regioes_2010",
layer = "regioes_2010")
map_regions <- spTransform(regions_OGR,CRS("+proj=longlat +datum=WGS84"))
map_regions_fortified <- fortify(map_regions)

#We make there be 0, 1, or 3 textile companies.
#map_regions_fortified is in  order by ID (region).
#So, we add a column with the number of textile companies 
#repeated the right number of times for how many of each region there is.

num_rows_per_region <- data.frame(table(map_regions_fortified$id))

map_regions_fortified <- data.frame(map_regions_fortified,
Num.factories = factor(rep(c(1,0,1,3,1),times=num_rows_per_region$Freq)))

#First, plot without any location dots.

ggplot()+geom_polygon(data=map_regions_fortified,
aes(x = long,y = lat, group=group, fill=Num.factories),colour="black")
#Set latitude and longitude based on the number of factories per region.

factory_locations <- data.frame(long = c(-65,-55,-51,-44,-42,-38),
lat = c(-5,-15,-27,-7,-12,-8))

#Add a dummy variable, which then allows the colour of the dots 
#to be a part of the legend.

factory_locations <- data.frame(factory_locations,
Dummy.var = rep("One dot = one factory location",times=nrow(factory_locations)))

#Replot adding factory location dots.
#We will use black dots here since will be easier to see.

ggplot()+geom_polygon(data=map_regions_fortified,
aes(x = long,y = lat, group=group, fill=Num.factories),colour="black")       
+ geom_point(data = factory_locations,aes(x = long,y = lat,colour = Dummy.var)) 
+ scale_colour_manual(values="black") + labs(colour="")

#Bonus: Let's change the color vector to something more color-blind friendly.

mycol <- c("#E69F00", "#56B4E9", "#009E73", "#F0E442", 
"#0072B2", "#D55E00", "#CC79A7","#490092")

ggplot()+geom_polygon(data=map_regions_fortified,
aes(x = long,y = lat, group=group, fill=Num.factories),colour="black")       
+ geom_point(data = factory_locations,aes(x = long,y = lat,colour = Dummy.var)) 
+ scale_colour_manual(values="black") + labs(colour="") 
+ scale_fill_manual(values=mycol)
library(raster)
library(tidyverse)
library(GISTools)
library(RColorBrewer)
library(ggalt)
library(ggthemes)

# Get polygon data for Brazil
brazil <- getData("GADM", country = "brazil", level = 1)

mymap <- fortify(brazil)

# Create dummy data staying in the polygons
# For more information: https://stackoverflow.com/questions/47696382/removing-data-outside-country-map-boundary-in-r/47699405#47699405
set.seed(123)
mydata <- data.frame(long = runif(200, min = quantile(mymap$long)[1], max = quantile(mymap$long)[4]),
                     lat = runif(200, min = quantile(mymap$lat)[1], max = quantile(mymap$lat)[4]),
                     factory = paste("factory ", 1:200, sep = ""),
                     stringsAsFactors = FALSE)

spdf <- SpatialPointsDataFrame(coords = mydata[, c("long", "lat")], data = mydata,
                               proj4string = CRS("+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"))


whatever <- spdf[!is.na(over(spdf, as(brazil, "SpatialPolygons"))), ]

whatever2 <- as.data.frame(whatever) %>%
             mutate(`Factory location` = "")


# Now I check how many data points (factories) exist in each polygon
# and create a data frame
factory.num <- poly.counts(pts = whatever, polys = brazil)
factory.num <- stack(factory.num)


ggplot() +
geom_cartogram(data = mymap, aes(x = long, y = lat, map_id = id),
               map = mymap) +
geom_cartogram(data = factory.num, aes(fill = values, map_id = ind),
               map = mymap) +
geom_point(data = whatever2, aes(x = long, y = lat, color = `Factory location`)) +
scale_fill_gradientn(name = "Number of factories", colours = brewer.pal(5, "Greens")) +
coord_map() +
theme_map()