ggplot2 中定义比例尺的一种新技巧

科技   2024-09-25 22:32   陕西  

欢迎关注R语言数据分析指南

本节来介绍ggplot2 3.5版本中一个容易被忽略的功能函数I()官方称其为Ignoring scales,针对该新功能官方给出了几个小例子,下面小编结合官网文档并在此基础上加上自己实际中的应用案例来稍微进行一些扩展。个人观点,仅供参考。内置数据直接复制代码运行

官方文档

https://www.tidyverse.org/blog/2024/02/ggplot2-3-5-0/

案例1-映射颜色

使用I()后可以给同一元素映射不同的颜色,而且会直接映射文本内容的颜色。这样在对同一元素进行映射时可以减少new_scale_color()的应用。当然此功能还有其妙用

p1 <- iris %>% select(1,2,5) %>% 
  ggplot(aes(Sepal.Length,Sepal.Width,color=Species))+
  geom_point()+
  theme(legend.position = "top")

p2 <- iris %>% select(1,2,5) %>% 
  mutate(col=case_when(Sepal.Length <6 &Sepal.Width < 3 ~ "red",
                                                TRUE ~ NA)) %>% 
  ggplot(aes(Sepal.Length,Sepal.Width))+
  geom_point(aes(color=Species),shape=1,size=4)+
  geom_point(aes(color=I(col)),show.legend = F)+
  theme(legend.position = "top")

p1+p2

案例2-设置注释文本位置

x=I(0.5),y=I(0.5),直接将文本锁定在图中心位置处,再也不用反复调整位置了,强迫症福音。那么既然可以调整注释文本自然其它注释元素也可以。

iris %>% select(1,2,5) %>% 
  ggplot(aes(Sepal.Length,Sepal.Width,color=Species))+
  geom_point()+
  theme(legend.position = "top")+
  annotate("text", label = "Text in the middle",
           x = I(0.5), y = I(0.5),size = 8)

相关性热图

library(corrplot)

M = cor(mtcars)
df <- M %>% as.data.frame() %>% rownames_to_column(var="id") %>% 
  pivot_longer(-id) %>% arrange(desc(value))

unique_values <- unique(df$value)
colors <- COL2('PRGn',n=length(unique_values)) 
color_mapping <- setNames(colors, unique_values)

dff <- df %>% mutate(col = sapply(value, function(x) color_mapping[as.character(x)]))

通过上面的代码根据value生成了一列连续型的颜色,那么后续若需要对此数据进行拆分则能保证颜色一致

>dff
# A tibble: 121 × 4
   id    name  value col    
   <chr> <chr> <dbl> <chr>  
 1 mpg   mpg       1 #40004B
 2 cyl   cyl       1 #40004B
 3 disp  disp      1 #40004B
 4 hp    hp        1 #40004B
 5 drat  drat      1 #40004B
 6 wt    wt        1 #40004B
 7 qsec  qsec      1 #40004B
 8 vs    vs        1 #40004B
dff %>% ggplot(aes(id,name))+
  geom_tile(aes(fill=I(col)),color="black") +
  geom_text(aes(label = round(value,digits = 2)),size = 10, size.unit = "pt") +
  labs(x=NULL,y=NULL)+
  theme(panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.text=element_text(size=10,color="black"),
        plot.margin = margin(c(0.5,0.5,0.5,0.5), unit="cm"))
df2 <- dff %>% filter(name=="mpg") %>% mutate(n=row_number())
df3 <- dff %>% filter(name=="cyl") %>% mutate(n=row_number())   
df4 <- dff %>% filter(name=="disp") %>% mutate(n=row_number())     
                                              
ggplot(x=1,y=n)+
  geom_rect(data=df2,aes(xmin=1,xmax=1.5,ymin=n-0.45,ymax=n+0.45,fill=I(rev(col))),
            show.legend = F,linewidth = 0.2,color="black",alpha=0.8)+
  geom_text(data=df2,
            aes(x=1.25,label=round(value,digits = 2),y=rev(n)),size=3,color="black",vjust=0.5,hjust=0.5)+
  geom_rect(data=df3,aes(xmin=1.6,xmax=2.1,ymin=n-0.45,ymax=n+0.45,fill=I(rev(col))),
            show.legend = F,linewidth = 0.2,color="black",,alpha=0.8)+
  geom_text(data=df3,
            aes(x=1.85,label=round(value,digits = 2),y=rev(n)),size=3,color="black",vjust=0.5,hjust=0.5)+
  geom_rect(data=df4,aes(xmin=2.2,xmax=2.7,ymin=n-0.45,ymax=n+0.45,fill=I(rev(col))),
            show.legend = F,linewidth = 0.2,color="black",,alpha=0.8)+
  geom_text(data=df4,
            aes(x=2.45,label=round(value,digits = 2),y=rev(n)),size=3,color="black",vjust=0.5,hjust=0.5)+
  theme_void()

看到这个图如果对代码比较熟悉的读者应该知道其用处,由于在前面的代码中对数值定义了颜色,因此拆分后进行绘图则数值的颜色会保持一致,同时对于geom_rect使用fill=I()直接用颜色值进行映射的确方便很多。

关注下方公众号下回更新不迷路

购买介绍

本节介绍到此结束,有需要学习R数据可视化的朋友欢迎到淘宝店铺:R语言数据分析指南,购买小编的R语言可视化文档(2024版),购买将赠送2023年的绘图文档内容。目前此文档(2023+2024)已经更新上传200案例文档,每个案例都附有相应的数据和代码,并配有对应的注释文档,方便大家学习和参考。

2024更新的绘图内容将同时包含数据+代码+注释文档+文档清单,2023无目录仅有数据文件夹,小编只分享案例文档,不额外回答问题,无答疑服务,零基础不推荐买。

案例特点

所选案例图均属于个性化分析图表完全适用于论文发表,内容异常丰富两年累计发布案例图200+,2024年6月起提供html版注释文档更加直观易学。文档累计上千人次购买拥有良好的社群交流体验。R代码结构清晰易懂,为防止中文乱码提供单独的注释文档

群友精彩评论

淘宝店铺

2024年已更新案例图展示

2023年案例图展示


R语言数据分析指南
R语言重症爱好者,喜欢绘制各种精美的图表,喜欢的小伙伴可以关注我,跟我一起学习
 最新文章