ggplot2按形状分隔图例

Jim*_*Jim 4 r ggplot2

# Data:  
zz <- "Small Large  Lat  Long 
1       51   2       11    10 
2       49   0       12    11  
3       77   7       13    13  
4       46   5       12    15     
5       32   6       13    14      
6       54   3       15    17
7       68   0       14    10
8       39   5       12    13"

Data <- as.data.frame(read.table(text=zz, header = TRUE))
Run Code Online (Sandbox Code Playgroud)

我成功绘制了一个连续变量,一个比率(小/大)。

虽然,“大”变量中存在一些0。发生这种情况时,我只想绘制“小”数字,因为不可能有比率。为此,我需要执行以下操作:

ratio.both <- Data %>% 
  filter(Large > 0) %>% 
  mutate(Ratio = Small/Large)

only.sml<- Data %>% 
  filter(Large < 1)
Run Code Online (Sandbox Code Playgroud)

然后,将它们都绘制在同一张图上(按较长的数据):

ggplot() +
  geom_point(data = ratio.both,
             aes(x = Long,
                 y = Lat,
                 size = Ratio),
             stroke = 0,
             colour = '#3B3B3B',
             shape=16) +
  #
  geom_point(data = only.sml,
             aes(x = Long,
                 y = Lat,
                 size = Small,
                 shape=1),
             stroke = 1,
             shape=1)
Run Code Online (Sandbox Code Playgroud)

注意形状上的差异。绘制以下内容

不是最好的图,而是演示示例 不是最好的图,而是演示示例

比率(填充)值和较小值之间的差异在地图上很明显,但在图例中很难。

我想要以下图例:

   #Title
   Size = both.ratio$Ratio,
   Shape/fill = Ratio or small value #whichever is easier
Run Code Online (Sandbox Code Playgroud)

小智 6

使用表中的变量通过内置的美学映射来对比数据要容易得多,而不是为小型和大型数据创建单独的几何。例如,您可以创建一个新变量,以检查该数据点是属于大型还是小型“类型”。然后,您可以绘制形状,颜色,大小或任何您想要的美学图,并可以选择手动添加比例(如果需要)。

Data %>% 
  mutate(is_large = ifelse(Large > 0, "Ratio", "Small"),

         size = ifelse(is_large == "Large", Small/Large, Small)) %>%
  ggplot(aes(Long, Lat, 
             size = size, 
             shape = is_large)) +
  geom_point() +
  scale_shape_manual(values = c("Ratio" = 16, "Small" = 1), 
                     name = "Size") +
  scale_size_continuous(name = "Ratio/small value") 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

或者,如果您想按点颜色进行对比:

Data %>% 
  mutate(is_large = ifelse(Large > 0, "Ratio", "Small"),

         size = ifelse(is_large == "Large", Small/Large, Small)) %>%
  ggplot(aes(Long, Lat, 
             size = size, 
             color = is_large)) +
  geom_point() +
  scale_color_manual(values = c("Ratio" = "blue", "Small" = "red"), 
                     name = "Size") +
  scale_size_continuous(name = "Ratio/small value") 
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明