ggplot2 分面图等添加注释文字,想加哪里加哪里: 自定义函数 AddText()

如果分面图上还想再添加文字,只能使用底层的grid包了。

整个图左下角是原点,向上、向右是正方向,宽高都标准化到[0, 1]之间。

函数定义

#' Add text to ggplot2 figures
#'
#' @param label text you want to put on figure
#' @param x position x, left is 0, right 1
#' @param y position y, bottom is 0, up 1
#' @param color text color
#' @param size font size
#'
#' @return
#' @export
#'
#' @examples
AddText=function(label="RNA cluster",x = 0.18,y = 0.035, color="red", size=12){
  library(grid)
  grid.text(label=label, x = x, y = y, 
            gp=gpar(col=color, fontsize=size,
                    draw=TRUE,just = "centre"))
}

例1:

在ggplot后执行,注意,不能是+号连接!
ggplot(mtcars, aes(mpg, wt)) + geom_point(); AddText("my note")

效果:
在这里插入图片描述

例2:

  p1=ggplot(mtcars, aes(mpg, wt)) + geom_point() + theme_classic()
  print(p1)
  print(AddText("my note"))
  print(AddText("another text", x=0.7, y=0.8, color = "navy"))

在这里插入图片描述

<think>好的,用户现在在Python的Matplotlib表中的特定位置添加圆圈。之前他们问过如何同时绘制柱状和折线,现在的问题是关于添加特定形状的标记,尤其是圆圈。我需要结合之前的回答和提供的引用内容来给出解决方案。 首先,用户提到参考了引用[3],其中讨论了学术散点,包括颜色映射和拟合关系式,这可能意味着用户需要更专业的表样式。之前的回答中已经使用了Matplotlib和Seaborn,所以这次应该继续使用这些库。 用户的需求是在特定位置添加圆圈,可能需要强调某些数据点或区域。根据引用[2],折线的绘制使用plot函数,而引用[3]提到了散点上绘制圆圈。可能需要使用annotate或直接绘制圆形标记。 我需要考虑几种方法:使用plt.Circle绘制圆形,使用annotate添加带圆圈的注释,或者在散点中用marker参数设置圆圈形状。同时,可能需要调整颜色、边框、透明度等属性,如引用[1]提到的美化表的方法。 另外,用户可能需要不同样式的圆圈,比如空心、实心、不同颜色,以及如何在多个子中应用。之前的回答中用了双Y轴和子矩阵,这里可以举例在子添加圆圈,保持一致性。 还需要注意代码的清晰度,提供完整的示例,包括数据生成、绘步骤和美化选项。可能还需要提到如何保存像,尤其是矢量,如引用[1]中提到的PDF输出。 最后,确保回答结构清晰,点说明不同方法,并给出应用场景,比如异常值标注、区域突出显示等。同时,生成相关问题,帮助用户进一步学习,比如如何添加箭头注释或组合其他形状。</think>### Python Matplotlib 添加特定位置圆圈的五种方法 在气象析、异常值标注等场景中,**精准定位可视化元素**是提升表专业性的关键。以下是基于Matplotlib的完整实现方案,包含**动态定位、样式控制、多场景应用**技巧。 --- #### 方法一:基础圆形绘制(plt.Circle) ```python import matplotlib.pyplot as plt import numpy as np fig, ax = plt.subplots(figsize=(8,6)) # 生成示例数据 x = np.linspace(0, 10, 100) y = np.sin(x) # 绘制主表 ax.plot(x, y, color='steelblue', label='温度变化') # 添加固定位置圆圈(坐标系为数据单位) circle1 = plt.Circle((3, 0.5), 0.8, # (x, y)坐标,半径 color='none', # 填充色 ec='red', # 边框颜色 lw=2, # 边框粗细 ls='--', # 边框样式 alpha=0.7) # 透明度 ax.add_patch(circle1) # 添加动态位置圆圈(随数据范围变化) current_max = np.argmax(y) circle2 = plt.Circle((x[current_max], y[current_max]), 0.5, fill=False, ec='green', lw=1.5) ax.add_patch(circle2) ax.legend() plt.title('温度变化趋势与关键点标注') plt.show() ``` **技术要点**: - `plt.Circle`使用**数据坐标系**定位,单位与表轴一致 - `add_patch()`方法将形元素绑定到坐标系 - `fill=False`创建空心圆,`alpha`控制透明度[^1] --- #### 方法二:注释式圆圈(annotate) ```python from matplotlib.patches import Ellipse fig, ax = plt.subplots() # 散点示例 x = np.random.randn(50) y = x + np.random.randn(50)*0.5 ax.scatter(x, y, c='blue', alpha=0.6) # 添加注释圆圈 ax.annotate('异常值区域', xy=(2, 3), # 箭头指向点 xytext=(1.5, 4), # 文本起始点 arrowprops=dict(facecolor='red', shrink=0.05), bbox=dict(boxstyle="round", fc="w"), fontsize=10) # 添加椭圆注释(可变形为圆) ellipse = Ellipse(xy=(2,3), width=1.2, height=1.2, angle=45, edgecolor='orange', facecolor='none', lw=2) ax.add_patch(ellipse) plt.grid(True, linestyle='--', alpha=0.5) plt.title('异常值区域标注') plt.show() ``` **优势**: - 支持**箭头+文字**组合标注 - 通过`Ellipse`实现旋转圆形标注 - `bbox`参数优化文本背景效果[^2] --- #### 方法三:散点标记(scatter) ```python fig, ax = plt.subplots() # 主数据 x_main = np.arange(10) y_main = x_main**2 # 圆圈标记数据 highlight_points = [(2,4), (5,25), (8,64)] ax.plot(x_main, y_main, 'b-', lw=2) # 添加空心圆标记 for point in highlight_points: ax.scatter(*point, s=300, # s控制圆大小 facecolors='none', edgecolors='r', linewidths=2, zorder=10) # 确保在最上层 plt.title('关键数据点突出显示') plt.show() ``` **应用场景**: - 突出显示特定数据点 - 批量添加相同样式的标记 - 通过`zorder`控制层叠顺序[^3] --- #### 方法四:样式化圆圈(自定义属性) ```python plt.style.use('ggplot') # 使用美化样式 fig, ax = plt.subplots() # 生成随机数据 np.random.seed(2023) data = np.random.normal(size=1000) # 直方 ax.hist(data, bins=30, density=True, alpha=0.7, color='#2ca02c') # 添加统计标注圆 mean_val = np.mean(data) circle = plt.Circle((mean_val, 0.3), 0.15, color='darkorange', alpha=0.9, hatch='////', # 填充案 edgecolor='black') ax.add_patch(circle) # 添加标注文本 ax.text(mean_val, 0.33, 'Mean Value\n{:.2f}'.format(mean_val), ha='center', va='bottom', fontsize=10, color='darkred') plt.title('布统计标注') plt.show() ``` **高级特性**: - `hatch`参数添加斜线填充案 - 结合文本标注实现复合标记 - 使用样式库提升整体美观度[^1] --- #### 方法五:多子同步标注 ```python fig, axes = plt.subplots(2, 2, figsize=(12,8)) # 定义公共圆属性 circle_params = { 'radius': 0.5, 'edgecolor': 'purple', 'facecolor': 'none', 'linewidth': 2 } # 在四个子添加圆圈 for i in range(2): for j in range(2): ax = axes[i,j] x = np.linspace(0, 10, 100) ax.plot(x, np.sin(x + i*j), color='teal') # 动态计算圆心位置 center_x = 5 + (-1)**i * 2 center_y = 0.5 + (-1)**j * 0.3 circle = plt.Circle((center_x, center_y), **circle_params) ax.add_patch(circle) ax.set_title(f'Subplot ({i+1},{j
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值