图中这种显著标明(指示信息)怎么标记?一次性告诉你Python和R的绘制技巧...

文摘   教育   2024-11-28 11:35   江苏  

前言

我们的数据可视化课程已经上线啦!!目前课程的主要方向是 科研、统计、地理相关的学术性图形绘制方法,后续也会增加商务插图、机器学等、数据分析等方面的课程。课程免费新增,这点绝对良心!

我们第一个数据可视化交流圈子也已经上线了,主要以我的第一本书籍《科研论文配图绘制指南-基于Python》为基础进行拓展,提供「课堂式」教学视频,还有更多拓展内容,可视化技巧远超书籍本身,书籍修正和新增都会分享到圈子里面~~

参与课程或者圈子的你将获取到:学员答疑、可视化资源分享、可视化技巧补充、可视化业务代做(学员和甲方对接)、副业交流、提升认知等等。


我们在绘制可视化图表时经常需要对特定区域、位置等使用文本箭头等标识性字符进行注释显示,这种注释在可视化制作中尤为重要,它可以突出重要信息,引起人们对图形某个特征的关注。接下来,小编就汇总一下在R和Python可视化绘制中是如何进行注释的。具体内容如下:

  • R注释操作
  • Python注释操作

R注释操作

在使用R进行可视化绘制中,起注释作用的绘图函数有很多,这里还是介绍基于ggplot2绘图体系中的绘图函数,主要介绍R-ggplot2和R-ggforce 包中关于注释的内容,如下:

R-ggplot2 注释操作

这一部分使用ggplot2中*annotate()*函数进行说明,这里小编直接给出一个具体案例,如下:

library(tidyverse)
library(ggtext)
library(hrbrthemes)
library(ggpubr)
library(ggsci)
library(ggforce)

plot01 <- ggplot(data = iris,aes(Petal.Length, Petal.Width,
                                 )) +
  geom_point(shape=21,aes(fill=Species),colour="black",size=3) +
  scale_fill_jco()+
  # 基础注释方式
  annotate(
    geom = "curve", x = 2., y = 1, xend = 1.5, yend = .65, 
    curvature = .3,arrow = arrow(length = unit(2, "mm")))+
  annotate(geom = "text", x = 2.1, y = 1, label = "setosa", hjust="left",vjust = .5)+
  
labs(
    title = "Example of <span style='color:#D20F26'>ggplot2::annotate()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>annotate()</span>",
    caption = "Visualization by <span style='color:#0057FF'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed") +
  theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                      size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
        )
Example of ggplot2 annotate()

当然如果想要实现这种“箭头”效果,ggplot2的geom_segment()和geom_curve()都可实现,感兴趣的小伙伴可去ggplot2官网(https://ggplot2.tidyverse.org/reference/index.html) 进行探索。下面小编将介绍一种更为方便直观且简单的方法。

R-ggforce 注释操作

R-ggforce包中有几个绘图函数可以实现较为灵活的注释效果,且语法较为简单。官网为:https://ggforce.data-imaginist.com/reference/index.html。详细如下:

  • 「geom_mark_rect()」
ggplot(iris, aes(Petal.Length, Petal.Width)) +
  geom_mark_rect(aes(fill = Species, label = Species),
                 con.cap = 0,label.fill='gray',
                 label.colour="black") +
  geom_point(shape=21,aes(fill=Species),colour="black",size=3) +
  scale_fill_nejm() +
  labs(
    title = "Example of <span style='color:#D20F26'>ggforce::geom_mark_rect()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_mark_rect()</span>",
    caption = "Visualization by <span style='color:#0057FF'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed") +
  theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                      size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
  )
Example of ggforce::geom_mark_rect()
  • 「geom_mark_circle()」
ggplot(iris, aes(Petal.Length, Petal.Width)) +
  geom_mark_circle(aes(fill = Species, label = Species),
                 con.cap = 0,label.fill='gray',
                 label.colour="black") +
  geom_point(shape=21,aes(fill=Species),colour="black",size=3) +
  scale_fill_nejm() +
  labs(
    title = "Example of <span style='color:#D20F26'>ggforce::geom_mark_circle()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_mark_circle()</span>",
    caption = "Visualization by <span style='color:#0057FF'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed") +
  theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                      size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
  )
Example of ggforce::geom_mark_circle()
  • 「geom_mark_ellipse()」
ggplot(iris, aes(Petal.Length, Petal.Width)) +
  geom_mark_ellipse(aes(fill = Species, label = Species),
                   con.cap = 0,label.fill='gray',
                   label.colour="black") +
  geom_point(shape=21,aes(fill=Species),colour="black",size=3) +
  scale_fill_nejm() +
  labs(
    title = "Example of <span style='color:#D20F26'>ggforce::geom_mark_ellipse()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_mark_ellipse()</span>",
    caption = "Visualization by <span style='color:#0057FF'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed") +
  theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                      size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
  )
Example of ggforce::geom_mark_ellipse()
  • 「geom_mark_hull()」
ggplot(iris, aes(Petal.Length, Petal.Width)) +
  geom_mark_hull(aes(fill = Species, label = Species),
                    con.cap = 0,label.fill='gray',
                    label.colour="black") +
  geom_point(shape=21,aes(fill=Species),colour="black",size=3) +
  scale_fill_nejm() +
  labs(
    title = "Example of <span style='color:#D20F26'>ggforce::geom_mark_hull()</span>",
    subtitle = "processed charts with <span style='color:#1A73E8'>geom_mark_hull()</span>",
    caption = "Visualization by <span style='color:#0057FF'>DataCharm</span>") +
  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed") +
  theme(plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",
                                      size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),
        plot.caption = element_markdown(face = 'bold',size = 12),
  )
Example of ggforce::geom_mark_hull()()

以上就是小编对在R中使用注释列举的几个几个小例子,当然,可能还不只这些,也希望小伙伴们可以公号后台看留言告知哈~~

Python 注释操作

介绍完R绘制注释(annotate)的方法,小编这里再简单介绍下Python的注释(annotate)方法,这里主要介绍Matplotlib的注释方法,如下:

import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(7,5),dpi=100)
plt.rcParams['font.family'] = ['Times New Roman']

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = ax.plot(t, s, lw=3,color="#BC3C28")
# 各种annotate样式
ax.annotate(
    'straight',
    xy=(0, 1), xycoords='data',
    xytext=(-50, 30), textcoords='offset points',
    arrowprops=dict(arrowstyle="->"))
ax.annotate(
    'arc3,\nrad 0.2',
    xy=(0.5, -1), xycoords='data',
    xytext=(-80, -60), textcoords='offset points',
    arrowprops=dict(arrowstyle="->",
                    connectionstyle="arc3,rad=.2"))
ax.annotate(
    'arc,\nangle 50',
    xy=(1., 1), xycoords='data',
    xytext=(-90, 50), textcoords='offset points',
    arrowprops=dict(arrowstyle="->",
                    connectionstyle="arc,angleA=0,armA=50,rad=10"))
ax.annotate(
    'arc,\narms',
    xy=(1.5, -1), xycoords='data',
    xytext=(-80, -60), textcoords='offset points',
    arrowprops=dict(
        arrowstyle="->",
        connectionstyle="arc,angleA=0,armA=40,angleB=-90,armB=30,rad=7"))
ax.annotate(
    'angle,\nangle 90',
    xy=(2., 1), xycoords='data',
    xytext=(-70, 30), textcoords='offset points',
    arrowprops=dict(arrowstyle="->",
                    connectionstyle="angle,angleA=0,angleB=90,rad=10"))
ax.annotate(
    'angle3,\nangle -90',
    xy=(2.5, -1), xycoords='data',
    xytext=(-80, -60), textcoords='offset points',
    arrowprops=dict(arrowstyle="->",
                    connectionstyle="angle3,angleA=0,angleB=-90"))
ax.annotate(
    'angle,\nround',
    xy=(3., 1), xycoords='data',
    xytext=(-60, 30), textcoords='offset points',
    bbox=dict(boxstyle="round"fc="0.8"),
    arrowprops=dict(arrowstyle="->",
                    connectionstyle="angle,angleA=0,angleB=90,rad=10"))
ax.annotate(
    'angle,\nround4',
    xy=(3.5, -1), xycoords='data',
    xytext=(-70, -80), textcoords='offset points',
    size=20,
    bbox=dict(boxstyle="round4,pad=.5"fc="0.8"),
    arrowprops=dict(arrowstyle="->",
                    connectionstyle="angle,angleA=0,angleB=-90,rad=10"))
ax.annotate(
    'angle,\nshrink',
    xy=(4., 1), xycoords='data',
    xytext=(-60, 30), textcoords='offset points',
    bbox=dict(boxstyle="round"fc="0.8"),
    arrowprops=dict(arrowstyle="->",
                    shrinkA=0, shrinkB=10,
                    connectionstyle="angle,angleA=0,angleB=90,rad=10"))

ax.annotate('', xy=(4., 1.), xycoords='data',
            xytext=(4.5, -1), textcoords='data',
            arrowprops=dict(arrowstyle="<->",
                            connectionstyle="bar",
                            ec="k",
                            shrinkA=5, shrinkB=5))
# 定制化操作
ax.set(xlim=(-1, 5), ylim=(-4, 3))
for spine in ['top','bottom','left','right']:
    ax.spines[spine].set_visible(False)
ax.tick_params(left=False,labelleft=False,bottom=False,labelbottom=False)
ax.set_title("Example Of Matplotlib.annotate()",size=15,fontweight="bold")
Example Of Matplotlib.annotate()

更多内容,大家可参看matplotlib官网样例即可。

总结

本期这篇推文,小编给大家简单汇总了绘图过程中一些注释(annotate) 的方法。从中可以看出,R还是比较方便的,且更加美观,还是那句话,适合自己的才是最好的,希望这篇文章能够帮助到大家

书籍推荐

可视化学习圈子是干什么的?

可视化学习圈子是书籍「科研论文配图绘制指南-基于Python」一书的学下圈子:主要通过以下几个方面,给大家带来比纸质书籍更丰富的学习内容:

  • 视频教学,和读者零距离互动交流
  • 及时修正勘误和定期新增绘制知识点
  • 拓展衍生,绘图知识点远超书籍本身
  • 直播视频+拓展资料+答疑,学习更高效

「PS」:我们直播教学内容为课堂式教学,原作者带着大家对书籍一章、一节、一页的进行教学。而且直播的视频都会通过剪辑后整理成课程,圈子中的同学可以免费、反复观看。当然,新增内容和定期答疑,直播也是如此。

  • 为何会有这个书籍学习社群?无门槛的微信群难免会鱼龙混杂,问题和质量都无法得到保证,而且一些关键问题经常被淹没,且没有沉淀价值。

  • 随着添加我微信的人日益增多,向我提问的人也越来越多,随便回答一下就太不负责任了;不回答也不是很好;如果都仔细回答,我也有自己的工作并且确实很忙,真的有点心有余而力不足!所以我才会建立这么一个渠道来沉淀我的可视化技巧和分享经验,以及给大家提供一个坚持学习的平台。

微信扫码下方二维码即可参与我们的书籍学习圈子啦:

微信扫码即可加入学习圈子

系统学习可视化

当然,在学习数据可视化的道路上,你也有很多问题得不到解答,也可以加入我们的可视化课程(可视化系列课程推文)后,在学员群里和大家一起谈论,一起进步,或者直接向我提问。如果我觉得你的问题很具有普适性,我会把它写成文章发布在公众号上,让更多人看到,有关我们数据可视化系列课程的服务内容,可以参考下面的 阅读原文

猜你喜欢

不是?!这种图一行代码就搞定了,超简单....
这图这么多人问!?赶紧给大家复现出来~~..
ggpubr!一键绘制出版级论文配图,绘图小白福音......
tidyterra!空间数据处理、可视化神器...
Antarctic-Plots!不用ArcGIS,我照样可以画出惊艳的地图...
比Matplotlib合并子图更方便!patchworklib让我告别PS拼图...
Xarray,不用ArcGIS,所有地理空间绘图全搞定...
Nature都推荐的箱线图(Boxplot)绘制工具长啥样?免费、在线、灵活操作...?
完美解决Matplotlib绘图中、英文字体混显问题..
MATLAB绘图不好看?!不是,你是还没发现这几个工具包吧..
不是,这个地理数据工具这么强的吗?数据处理、可视化它都行..
这种环形图太难画?!带你一行代码搞定..
不是,这封面图这么多人问的吗?教程来了
不用Seaborn,这个工具也能绘制超炫的统计图形···
NetworkX,网络结构图最强绘制工具·····

DataCharm
定期更新与科研学术有关的内容,比如论文插图绘制技巧、实用Python/R拓展包解读、作图软件(Veusz、Qrigin等)教程以及最前沿科研方法等。
 最新文章