ggplot2中如何精确控制geom_point size范围?90%的人都忽略了这3个关键参数

第一章:ggplot2中geom_point size范围控制的重要性

在数据可视化过程中,点的大小是传递信息的重要视觉通道之一。使用 ggplot2 绘制散点图时,通过 geom_point()size 参数可以映射数值或分类变量到点的半径,从而增强图形的信息密度。然而,若不加控制地映射原始数据到点的大小,可能导致视觉失真——过大的点会覆盖其他数据,过小的点则难以辨识。

合理设置点大小范围的必要性

  • 避免视觉误导:极端值可能导致某些点异常大,掩盖其他数据分布
  • 提升可读性:统一的尺寸范围使图形更整洁、易于比较
  • 符合出版标准:学术图表通常要求点的大小在合理区间内

使用 scale_size_radius 控制范围

通过 scale_size_radius() 可以明确设定点的最大和最小半径,确保视觉一致性。以下示例展示如何控制点的大小范围:
# 加载 ggplot2
library(ggplot2)

# 示例数据
data <- data.frame(
  x = rnorm(50),
  y = rnorm(50),
  size_var = abs(rnorm(50, mean = 1, sd = 0.5))
)

# 绘图并控制点的半径范围(单位:毫米)
ggplot(data, aes(x = x, y = y, size = size_var)) +
  geom_point() +
  scale_size_radius(
    name = "Size Variable",
    range = c(1, 8)  # 最小半径1mm,最大8mm
  )
该代码中,range = c(1, 8) 指定了映射后的点半径范围,防止过大或过小的点影响整体布局。

不同缩放方法的对比

函数用途适用场景
scale_size()线性映射到面积强调数量级差异
scale_size_radius()线性映射到半径保持视觉比例一致
正确选择大小映射方式并限定范围,是创建专业级散点图的关键步骤。

第二章:理解控制点大小的核心参数

2.1 scale_size_continuous:连续变量的映射原理与实践

在数据可视化中,scale_size_continuous 用于将连续型变量映射到图形元素的大小,实现数值与视觉感知的线性或非线性对应。
基本用法与参数解析
ggplot(data, aes(x = x_var, y = y_var, size = continuous_val)) +
  geom_point() +
  scale_size_continuous(range = c(1, 10), name = "Value")
该代码将 continuous_val 映射到点的半径大小,range 控制最小和最大显示尺寸,name 设置图例标题。默认使用线性缩放,适用于差异明显的连续数据。
视觉感知优化策略
  • 避免过大的尺寸范围导致视觉失衡
  • 结合透明度(alpha)缓解重叠问题
  • 使用 trans 参数应用对数变换处理偏态分布

2.2 range参数:如何精确设定size的最小与最大值

在配置资源限制时,range 参数常用于限定 size 的取值区间,确保系统稳定性与资源合理分配。
参数语法结构
range: {
  min: "10Mi",
  max: "1Gi"
}
上述配置表示 size 的最小值为 10MiB,最大值为 1GiB。该结构常用于 Kubernetes 资源配额或对象存储限制中。
典型应用场景
  • 容器内存请求与限制的边界控制
  • 文件上传服务中对单个文件大小的约束
  • 数据库分片容量规划中的阈值设定
验证规则说明
参数类型说明
minstring最小尺寸,必须符合单位规范(如Ki/Mi/Gi)
maxstring最大尺寸,需大于 min 值

2.3 limits参数:数据裁剪与视觉表达的平衡技巧

在可视化过程中,合理设置坐标轴范围对突出关键信息至关重要。limits 参数允许开发者显式定义坐标轴的数据边界,从而实现数据裁剪与视觉表达的平衡。
参数作用机制
limits 接收一个包含最小值和最大值的数组,超出此范围的数据将被剔除或截断。这不仅减少了噪声干扰,还能增强趋势的可读性。

ggplot(data, aes(x = time, y = value)) +
  scale_y_continuous(limits = c(0, 100))
上述代码将 Y 轴限制在 0 到 100 之间。若原始数据存在超过 100 的异常值,系统会自动将其移除并发出警告,确保图形区域聚焦于目标区间。
使用建议
  • 避免过度裁剪导致信息丢失
  • 结合 oob(out of bounds)处理函数自定义越界行为
  • 在时间序列中慎用,防止断裂趋势误判

2.4 guide参数:图例定制化提升图表可读性

在数据可视化中,图例(guide)是理解图表的关键组件。通过`guide`参数,用户可对颜色、形状、尺寸等视觉通道的映射进行精细化控制,显著提升图表可读性。
常见guide参数配置
  • color:控制颜色图例的标题、位置与取值范围
  • shape:自定义离散型分类的符号表示
  • size:调节连续变量映射到点大小的图例展示
ggplot(data, aes(x='x', y='y', color='category')) +
  geom_point() +
  guides(color=guide_legend(title="分类", override.aes={'size': 3}))
上述代码中,guides()函数通过guide_legend重新设置图例标题,并使用override.aes调整图例中图元的显示大小,避免因原始图形尺寸过小导致识别困难。该机制支持动态适配多种视觉属性,增强用户体验。

2.5 trans参数:尺度变换在size映射中的高级应用

在数据可视化中,trans参数用于控制尺寸映射的非线性变换,提升图形表现力。通过引入对数或幂函数变换,可有效缓解极端值对视觉感知的影响。
常见变换类型
  • log:对数值取对数,压缩大值区间
  • sqrt:平方根变换,温和压缩高值
  • pow:自定义幂次变换,灵活调节分布
代码示例
import matplotlib.pyplot as plt
plt.scatter(x, y, s=np.log(size + 1), alpha=0.6)
上述代码使用对数变换处理尺寸变量,避免个别极大值占据过多视觉空间。np.log(size + 1)确保零值安全,并实现平滑的尺度压缩,使整体分布更均衡。

第三章:离散变量下的size控制策略

3.1 scale_size_discrete:分类数据的点大小分配

在处理分类变量时,scale_size_discrete() 提供了一种将不同类别映射到不同点大小的可视化策略,使图形能更直观地区分分组信息。
基本用法与参数解析

ggplot(iris, aes(x = Sepal.Length, y = Petal.Length, size = Species)) +
  geom_point() +
  scale_size_discrete(range = c(2, 6))
上述代码中,size = Species 将分类变量绑定到点的大小;range 参数控制最小和最大点的尺寸(单位为毫米),确保视觉差异清晰可辨。
适用场景与设计建议
  • 适用于类别数量较少(通常 ≤ 5)的数据集
  • 避免在连续变量上使用,应改用 scale_size_continuous()
  • 结合形状或颜色映射可增强多维分类识别能力

3.2 使用breaks和labels优化图例呈现

在数据可视化中,合理配置图例的断点(breaks)与标签(labels)能显著提升图表可读性。通过自定义 breaks,可以控制图例中显示的关键数值点,避免信息过载。
自定义断点与标签映射
使用 breaks 参数指定图例分段值,结合 labels 为每个区间赋予语义化名称,增强用户理解。

scale_fill_gradient(breaks = c(0, 50, 100), 
                    labels = c("低", "中", "高"),
                    limits = c(0, 100))
上述代码将连续色阶划分为三个关键区间:0、50 和 100,并用中文标签“低”“中”“高”替代原始数值,使非技术用户也能快速解读数据分布。
应用场景示例
  • 气象图中温度区间的语义标注
  • 人口密度图的分级着色
  • 财务数据中的风险等级划分

3.3 实战案例:多类别散点图的可视化调优

在处理高维分类数据时,多类别散点图常因类别重叠、颜色混淆导致可读性下降。通过合理调优视觉编码,可显著提升信息传达效率。
优化色彩与透明度配置
使用语义化调色板区分类别,并引入透明度避免过度遮挡:
import seaborn as sns
sns.scatterplot(data=df, x='feature_a', y='feature_b',
                hue='category', palette='Set1', alpha=0.7)
其中,palette='Set1' 提供高对比度离散色系,alpha=0.7 减少密集区域的视觉堆积。
动态调整标记形状与大小
为不同类别分配独特标记,增强视觉区分度:
  • 圆形('o')代表对照组
  • 三角形('^')代表实验组
  • 方形('s')代表基准组
结合 size 参数映射第三维度变量,实现多维信息融合表达。

第四章:综合应用场景与常见问题规避

4.1 结合alpha和color实现多维数据表达

在可视化中,颜色(color)常用于表示类别或数值大小,而透明度(alpha)则可作为补充维度,增强数据表达的层次感。通过同时调节这两个属性,可在同一图表中传递更多维度信息。
双维度映射策略
将数值变量映射到颜色渐变,类别或置信度通过alpha控制:
  • 高饱和色表示高温,低透明度表示预测不确定性
  • 分类标签用不同色调,出现频率由alpha体现
plt.scatter(x, y, c=temperature, alpha=confidence, cmap='viridis')
上述代码中,c=temperature绑定颜色映射至温度值,alpha=confidence使点的透明度随置信度变化,cmap='viridis'选用连续色谱,整体实现四维数据(x, y, color, alpha)的融合呈现。

4.2 避免过度放大导致的视觉误导

在数据可视化中,适度的图形缩放有助于突出关键信息,但过度放大可能扭曲数据的真实分布,引发误判。
常见误导形式
  • 纵轴截断导致增长趋势被夸大
  • 局部放大掩盖整体波动特征
  • 非线性刻度未明确标注
代码示例:安全的图表缩放控制
const chart = new Chart(ctx, {
  type: 'line',
  options: {
    scales: {
      y: {
        min: 0, // 禁止自动截断
        ticks: {
          callback: (value) => value.toFixed(2)
        }
      }
    },
    plugins: {
      zoom: {
        pan: { enabled: false }, // 关闭自由拖拽
        zoom: { wheel: { enabled: false } } // 禁用滚轮缩放
      }
    }
  }
});
该配置通过关闭交互式缩放与平移功能,强制图表始终展示完整数据范围,防止用户因手动放大而忽略上下文。同时,Y轴从零开始可避免柱状图或折线图产生虚假增幅错觉。

4.3 响应式图表设计:不同输出尺寸下的size适配

在多设备环境下,图表的尺寸适配至关重要。通过动态计算容器宽度并调整 SVG 或 Canvas 的绘制尺寸,可实现响应式渲染。
基于视口的尺寸计算
使用 JavaScript 获取父容器实际宽度,并据此设置图表尺寸:
const chartContainer = document.getElementById('chart');
const width = chartContainer.clientWidth;
const height = width * 0.6; // 维持宽高比
该逻辑确保图表随容器缩放,避免溢出或留白。
响应式配置参数表
设备类型推荐最小宽度(px)建议宽高比
手机3201:0.6
平板7681:0.7
桌面端10241:0.5
通过媒体查询或 JavaScript 动态加载对应配置,提升跨设备可视化体验。

4.4 与theme系统协同优化整体视觉效果

在现代前端架构中,组件库与 theme 系统的深度集成是实现一致视觉体验的关键。通过注入主题变量,Button 组件可动态适配不同风格场景。
主题变量注入机制

:root {
  --button-primary-bg: var(--theme-color-primary);
  --button-primary-text: #fff;
}

.button.primary {
  background-color: var(--button-primary-bg);
  color: var(--button-primary-text);
}
上述 CSS 利用 CSS 自定义属性与 var() 函数,将主题色动态映射到组件样式中,实现无需重写样式即可切换外观。
响应式主题策略
  • 支持亮色/暗色模式自动切换
  • 通过 prefers-color-scheme 媒体查询感知系统偏好
  • 运行时动态更新主题变量以响应用户选择

第五章:总结与高效可视化建议

选择合适的图表类型
数据可视化的核心在于匹配数据特征与图表表达能力。时间序列数据优先使用折线图,分类对比推荐柱状图,构成比例可采用堆叠条形图或饼图(限类别较少时)。例如,在监控系统CPU使用率时,折线图能清晰反映趋势变化。
优化视觉编码提升可读性
避免过度使用颜色和阴影。应利用颜色突出关键数据点,如异常值或目标达成状态。以下代码展示如何在Go语言中为日志级别添加颜色标记,便于快速识别:

package main

import "fmt"

func colorize(level string, msg string) string {
    switch level {
    case "ERROR":
        return "\033[31m" + level + ": " + msg + "\033[0m" // 红色
    case "WARN":
        return "\033[33m" + level + ": " + msg + "\033[0m" // 黄色
    default:
        return level + ": " + msg
    }
}

func main() {
    fmt.Println(colorize("ERROR", "Disk usage exceeds 90%"))
}
构建响应式仪表板布局
现代监控面板需适配多设备。使用CSS Grid或Flexbox实现弹性布局,确保图表在不同分辨率下保持可读。以下是关键组件布局建议:
区域推荐内容更新频率
顶部横幅系统健康状态、告警计数每5秒
中部主区核心指标趋势图每10秒
侧边栏服务依赖拓扑静态或手动刷新
  • 启用数据聚合以减少前端渲染压力
  • 对高频率指标实施采样策略
  • 使用WebSocket实现实时推送而非轮询
library(ggbreak) groups <- c("pre", "4week", "12week") types_e <- c("miRNA") # 关注的5类 data_e <- data.frame( day = rep(groups, each = length(types_e)), # 分组循环 type = rep(types_e, length(groups)), # 类型循环 percentage = c( 1, 3.679752882, 2.754551466 ) ) #50-10 #3.436906001, 93.00438668, 0.026707928, 0.070520261, 0.388125972, #4.875146393, 90.5320351, 0.120605736, 0.098397051, 0.595006577, #3.923130159, 92.33654893, 0.08716406, 0.098500153, 0.630142723 #40-1 #3.637845281 92.38240363 0.032023946 0.126150571 0.387382362 #5.12679741 89.67248499 0.131152433 0.184554552 0.587593297 #4.120364213 91.64425657 0.098128847 0.184599693 0.62438567 #50-1 #3.581991585, 92.59230943, 0.033500086, 0.111173957, 0.387940679, #5.06075475,89.9623483,0.123272038,0.158617155,0.589348538, #4.073143384,91.86078102,0.092277711,0.160727738,0.625260022 # 设定天数顺序 data_e$day <- factor(data_e$day, levels = groups) p_e <- ggplot(data_e, aes(x = day, y = percentage, color = type, group = type)) + geom_line(size = 1) + # 折线宽度 geom_point(size = 3) + # 点大小 theme_classic() + labs(x = "", y = "rate of change") + # 轴标题 scale_color_manual(values = c("#adc9ca", "#a7a5d7", "#ffac5f", "#7aa5d2", "#e49898")) + # 颜色匹配 theme( axis.text.x = element_text(angle = 45, hjust = 1), # x轴标签倾斜 legend.position = "top" # 图例置顶 ) p_e = p_e+scale_y_break(c(6, 89)) ggsave( filename = "F:/jbj/result/small_RNA_seq/Summary_analysis/miRNA_rate_of_change.tiff", # 文件名 plot = p_e, # 图形对象 device = "tiff", # 格式:推荐TIFF/PDF width = 12.5, # 单栏宽度(厘米) height = 12, # 高度(可选,自动计算) units = "cm", # 单位:厘米 dpi = 600, # 分辨率:期刊标准 compression = "lzw" # TIFF压缩格式 ) # 若有重复实验,可添加误差线(示例): # geom_errorbar(aes(ymin=percentage-se, ymax=percentage+se), width=0.2) 不改变原始代码把Y轴改为0-5
11-20
# 加载必要的包 library(mgcv) library(readxl) library(rms) library(devEMF) library(broom) library(car) library(ggplot2) library(patchwork) library(viridis) # 设置输出目录 output_dir <- "F:/eddies_data/gam1" # 如果目录不存在,则创建 if (!dir.exists(output_dir)) { dir.create(output_dir, recursive = TRUE) cat("已创建输出目录:", output_dir, "\n") } # 读取数据 data <- read_excel("F:/eddies_data/fishery_eddies1.xlsx") # 查看数据结构 str(data) head(data) # 检查数据中是否有缺失值 cat("数据缺失值统计:\n") print(colSums(is.na(data))) # 创建对数变换后的响应变量 data$log_cpue <- log(data$cpue + 1) # 创建因子变量:正就是反气旋涡,负就是气旋涡 data$eddy_type_fac <- factor(data$eddy_type, levels = c(-1, 1), labels = c("气旋涡", "反气旋涡")) # 查看数据分布 cat("气旋涡数据点数量:", sum(data$eddy_type == -1 & !is.na(data$eddy_type)), "\n") cat("反气旋涡数据点数量:", sum(data$eddy_type == 1 & !is.na(data$eddy_type)), "\n") # 使用交互效应模型 final_model <- gam(log_cpue ~ eddy_type_fac + te(longitude, latitude) + # 经纬度交互项,不区分涡旋类型 s(relative_distance, by = eddy_type_fac) + s(amplitude, by = eddy_type_fac) + s(speed_average, by = eddy_type_fac) + as.factor(year) + # 年份作为固定效应 as.factor(month), # 月份作为固定效应 # 查看模型摘要 cat("\n=== 交互效应模型摘要 ===\n") print(summary(final_model)) # 创建分别显示每个涡旋类型偏效应图的函数,优化纵坐标范围 plot_effect_by_type_optimized <- function(model, variable, eddy_types = c("气旋涡", "反气旋涡")) { # 创建一个新的数据框用于预测 plot_data <- expand.grid( eddy_type_fac = factor(eddy_types, levels = c("气旋涡", "反气旋涡")), stringsAsFactors = FALSE ) # 为每个变量设置合理的范围 if (variable == "longitude") { plot_data[[variable]] <- seq(min(data$longitude, na.rm = TRUE), max(data$longitude, na.rm = TRUE), length = 100) } else if (variable == "latitude") { plot_data[[variable]] <- seq(min(data$latitude, na.rm = TRUE), max(data$latitude, na.rm = TRUE), length = 100) } else if (variable == "relative_distance") { plot_data[[variable]] <- seq(min(data$relative_distance, na.rm = TRUE), max(data$relative_distance, na.rm = TRUE), length = 100) } else if (variable == "amplitude") { plot_data[[variable]] <- seq(min(data$amplitude, na.rm = TRUE), max(data$amplitude, na.rm = TRUE), length = 100) } else if (variable == "speed_average") { plot_data[[variable]] <- seq(min(data$speed_average, na.rm = TRUE), max(data$speed_average, na.rm = TRUE), length = 100) } # 设置其他变量为均值 other_vars <- c("longitude", "latitude", "relative_distance", "amplitude", "speed_average") other_vars <- setdiff(other_vars, variable) for (var in other_vars) { plot_data[[var]] <- mean(data[[var]], na.rm = TRUE) } # 设置年份和月份为最常见的水平 plot_data$year <- as.integer(names(sort(table(data$year), decreasing = TRUE)[1])) plot_data$month <- as.integer(names(sort(table(data$month), decreasing = TRUE)[1])) # 预测 - 使用terms获取偏效应 pred <- predict(model, newdata = plot_data, type = "terms", se.fit = TRUE) # 提取对应变量的偏效应 term_names <- colnames(pred$fit) var_terms <- grep(variable, term_names, value = TRUE) # 为每个eddy_type提取对应的项 plot_data$fit <- NA plot_data$se <- NA for (i in 1:nrow(plot_data)) { eddy_type <- as.character(plot_data$eddy_type_fac[i]) # 查找对应的项名称 target_term <- grep(paste0(variable, ".+", eddy_type), term_names, value = TRUE) if (length(target_term) == 0) { # 如果找不到,尝试其他匹配方式 target_term <- grep(paste0(variable, ".*", substr(eddy_type, 1, 2)), term_names, value = TRUE) } if (length(target_term) > 0) { plot_data$fit[i] <- pred$fit[i, target_term[1]] plot_data$se[i] <- pred$se.fit[i, target_term[1]] } } plot_data$upper <- plot_data$fit + 1.96 * plot_data$se plot_data$lower <- plot_data$fit - 1.96 * plot_data$se # 计算纵坐标的合理范围,让曲线变化更明显 y_range <- range(plot_data$fit, na.rm = TRUE) y_span <- diff(y_range) # 如果变化范围太小,扩大纵坐标范围以显示变化 if (y_span < 0.1) { y_center <- mean(y_range) y_range <- c(y_center - 0.1, y_center + 0.1) } else { # 添加一些边距 y_range <- c(y_range[1] - 0.05 * y_span, y_range[2] + 0.05 * y_span) } # 绘制图表 p <- ggplot(plot_data, aes_string(x = variable, y = "fit", color = "eddy_type_fac", fill = "eddy_type_fac")) + geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2, color = NA) + geom_line(size = 1) + labs(title = paste0(variable, "对对数CPUE的偏效应"), x = switch(variable, "longitude" = "经度", "latitude" = "纬度", "relative_distance" = "相对距离", "amplitude" = "振幅", "speed_average" = "平均速度", variable), y = "对对数CPUE的影响", color = "涡旋类型", fill = "涡旋类型") + theme_minimal() + theme(legend.position = "bottom") + coord_cartesian(ylim = y_range) # 关键:限制纵坐标范围 return(p) } # 使用更简单但有效的方法 - 直接使用plot.gam但调整纵坐标 plot_smooth_effects <- function(model, data) { # 获取所有平滑项 smooth_terms <- summary(model)$s.table # 为每个变量创建偏效应图 variables <- c("relative_distance", "amplitude", "speed_average") # 移除了经纬度 for (var in variables) { png(file.path(output_dir, paste0("optimized_", var, "_effect.png")), width = 800, height = 600) # 创建预测数据 new_data <- data.frame(eddy_type_fac = factor(rep(c("气旋涡", "反气旋涡"), each = 100))) # 设置变量范围 var_range <- range(data[[var]], na.rm = TRUE) new_data[[var]] <- rep(seq(var_range[1], var_range[2], length = 100), 2) # 设置其他变量为均值 other_vars <- c("longitude", "latitude", "relative_distance", "amplitude", "speed_average") other_vars <- setdiff(other_vars, var) for (v in other_vars) { new_data[[v]] <- mean(data[[v]], na.rm = TRUE) } # 设置年份和月份为最常见的水平 new_data$year <- as.integer(names(sort(table(data$year), decreasing = TRUE)[1])) new_data$month <- as.integer(names(sort(table(data$month), decreasing = TRUE)[1])) # 预测 - 使用terms获取偏效应 pred <- predict(model, newdata = new_data, type = "terms", se.fit = TRUE) # 提取对应变量的偏效应 term_names <- colnames(pred$fit) var_terms <- grep(var, term_names, value = TRUE) # 为每个eddy_type提取对应的项 new_data$fit <- NA new_data$se <- NA for (i in 1:nrow(new_data)) { eddy_type <- as.character(new_data$eddy_type_fac[i]) # 查找对应的项名称 target_term <- grep(paste0(var, ".+", eddy_type), term_names, value = TRUE) if (length(target_term) == 0) { # 如果找不到,尝试其他匹配方式 target_term <- grep(paste0(var, ".*", substr(eddy_type, 1, 2)), term_names, value = TRUE) } if (length(target_term) > 0) { new_data$fit[i] <- pred$fit[i, target_term[1]] new_data$se[i] <- pred$se.fit[i, target_term[1]] } } new_data$upper <- new_data$fit + 1.96 * new_data$se new_data$lower <- new_data$fit - 1.96 * new_data$se # 计算纵坐标范围 - 聚焦于变化部分 y_range <- range(new_data$fit, na.rm = TRUE) y_span <- diff(y_range) # 如果变化太小,扩大范围 if (y_span < 0.5) { y_center <- mean(y_range) y_range <- c(y_center - 0.25, y_center + 0.25) } # 使用ggplot绘制偏效应图 p <- ggplot(new_data, aes_string(x = var, y = "fit", color = "eddy_type_fac", fill = "eddy_type_fac")) + geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2, color = NA) + geom_line(size = 1) + labs(title = paste0("偏效应: ", switch(var, "longitude" = "经度", "latitude" = "纬度", "relative_distance" = "相对距离", "amplitude" = "振幅", "speed_average" = "平均速度", var)), x = switch(var, "longitude" = "经度", "latitude" = "纬度", "relative_distance" = "相对距离", "amplitude" = "振幅", "speed_average" = "平均速度", var), y = "对对数CPUE的偏效应", color = "涡旋类型", fill = "涡旋类型") + theme_minimal() + theme(legend.position = "bottom") + coord_cartesian(ylim = y_range) # 关键:聚焦于变化部分 print(p) dev.off() } } # 修改后的经纬度交互偏效应图 plot_spatial_partial_effect <- function(model, data) { # 创建经纬度网格 lon_seq <- seq(min(data$longitude, na.rm = TRUE), max(data$longitude, na.rm = TRUE), length = 50) lat_seq <- seq(min(data$latitude, na.rm = TRUE), max(data$latitude, na.rm = TRUE), length = 50) # 创建预测数据 - 不再区分涡旋类型 grid_data <- expand.grid( longitude = lon_seq, latitude = lat_seq ) # 设置其他变量为均值 grid_data$relative_distance <- mean(data$relative_distance, na.rm = TRUE) grid_data$amplitude <- mean(data$amplitude, na.rm = TRUE) grid_data$speed_average <- mean(data$speed_average, na.rm = TRUE) grid_data$year <- as.integer(names(sort(table(data$year), decreasing = TRUE)[1])) grid_data$month <- as.integer(names(sort(table(data$month), decreasing = TRUE)[1])) # 设置涡旋类型为最常见的水平 grid_data$eddy_type_fac <- factor( names(sort(table(data$eddy_type_fac), decreasing = TRUE)[1]), levels = c("气旋涡", "反气旋涡") ) # 预测 - 使用terms获取偏效应 pred <- predict(model, newdata = grid_data, type = "terms", se.fit = TRUE) # 提取经纬度交互项的偏效应 term_names <- colnames(pred$fit) spatial_term <- grep("te\\(longitude,latitude\\)", term_names, value = TRUE) if (length(spatial_term) > 0) { grid_data$partial_effect <- pred$fit[, spatial_term[1]] # 绘制偏效应图 p <- ggplot(grid_data, aes(x = longitude, y = latitude, fill = partial_effect)) + geom_tile() + scale_fill_viridis_c(name = "偏效应") + labs(title = "经纬度交互项对对数CPUE的偏效应", x = "经度", y = "纬度") + theme_minimal() + theme(legend.position = "bottom") ggsave(file.path(output_dir, "spatial_partial_effect.png"), p, width = 10, height = 8) return(p) } else { cat("警告:未找到经纬度交互项\n") return(NULL) } } # 使用第二种方法绘制优化后的偏效应图 plot_smooth_effects(final_model, data[!is.na(data$eddy_type), ]) # 绘制经纬度交互偏效应图 plot_spatial_partial_effect(final_model, data[!is.na(data$eddy_type), ]) # 创建组合对比图 create_comparison_plots <- function(model, data) { combined_data <- data[!is.na(data$eddy_type), ] # 相对距离对比 p1 <- ggplot(combined_data, aes(x = relative_distance, y = log_cpue, color = eddy_type_fac)) + geom_point(alpha = 0.2) + geom_smooth(method = "gam", formula = y ~ s(x)) + labs(title = "相对距离 vs 对数CPUE", x = "相对距离", y = "对数CPUE") + theme_minimal() + theme(legend.position = "none") # 振幅对比 p2 <- ggplot(combined_data, aes(x = amplitude, y = log_cpue, color = eddy_type_fac)) + geom_point(alpha = 0.2) + geom_smooth(method = "gam", formula = y ~ s(x)) + labs(title = "振幅 vs 对数CPUE", x = "振幅", y = "对数CPUE") + theme_minimal() + theme(legend.position = "none") # 速度对比 p3 <- ggplot(combined_data, aes(x = speed_average, y = log_cpue, color = eddy_type_fac)) + geom_point(alpha = 0.2) + geom_smooth(method = "gam", formula = y ~ s(x)) + labs(title = "平均速度 vs 对数CPUE", x = "平均速度", y = "对数CPUE") + theme_minimal() + theme(legend.position = "none") # 获取图例 legend_plot <- ggplot(combined_data, aes(x = relative_distance, y = log_cpue, color = eddy_type_fac)) + geom_point(alpha = 0.2) + geom_smooth(method = "gam", formula = y ~ s(x)) + labs(color = "涡旋类型") + theme_minimal() + theme(legend.position = "bottom") legend <- cowplot::get_legend(legend_plot) # 组合图表 top_row <- p1 + p2 bottom_row <- p3 + plot_spacer() # 占位符保持对齐 combined <- top_row / bottom_row / legend + plot_layout(heights = c(2, 2, 0.5)) ggsave(file.path(output_dir, "comparison_scatter_plots.png"), combined, width = 12, height = 10) } # 创建对比散点图 create_comparison_plots(final_model, data) # 模型诊断 cat("\n=== 模型诊断 ===\n") png(file.path(output_dir, "model_diagnostics.png"), width = 800, height = 600) par(mfrow = c(2, 2)) gam.check(final_model) dev.off() # 保存模型结果 sink(file.path(output_dir, "model_summary.txt")) cat("GAM模型分析结果\n") cat("===============\n\n") print(summary(final_model)) sink() cat("\n分析完成!优化后的图表已保存到:", output_dir, "\n") 帮我分析一下这个代码正确吗
11-14
# 导入所需的包 library(ggplot2) library(ggsignif) library(ggpubr) library(RColorBrewer) setwd("F:/RNA_sncRNA/") # 导入数据 plot_data <- read.csv(file = "F:/RNA_sncRNA/MT_cyto_tsRNA.csv") level_order <- c("pre_mt","4week_mt","12week_mt","pre_cyto","4week_cyto","12week_cyto") plot_data$group <- factor(plot_data$group, levels = level_order) #----------------------- p<- ggplot(data=plot_data)+ geom_boxplot(mapping=aes(x=group,y=Retive_Abundance,colour = group ), #箱线图 alpha = 0.5, size=1.5, width = 0.6)+ geom_jitter(mapping=aes(x=group,y=Retive_Abundance,colour = group), #散点 alpha = 0.3,size=3)+ scale_color_manual(limits=c("pre_mt","4week_mt","12week_mt","pre_cyto","4week_cyto","12week_cyto"), values=c("#85B22E","#5F80B4","#E29827","#922927","#E29822","#922945"))+ #颜色 geom_signif(mapping=aes(x=group,y=Retive_Abundance), # 不同组别的显著性 comparisons = list(c("pre_mt", "4week_mt"), # 哪些组进行比较 c("pre_mt", "12week_mt"), c("4week_mt", "12week_mt"), c("pre_cyto", "4week_cyto"), c("pre_cyto", "12week_cyto"), c("4week_cyto", "12week_cyto")), map_signif_level=T, # T显示显著性,F显示p value tip_length=c(0,0,0,0,0,0,0,0,0,0,0,0), # 修改显著性线两端的长短 y_position = c(40,41,42,39,38,40), # 设置显著性线的位置高度 size=1, # 修改线的粗细 textsize = 4, # 修改显著性标记的大小 test = "t.test")+ # 检验的类型 theme_classic( # 主题设置,这个是无线条主题 base_line_size = 1 # 坐标轴的粗细 )+ scale_y_continuous(limits = c(0, 12), expand = c(0,0))+ labs(title="White blood cell(WBC)",x="",y="Retive_Abundance")+ # 添加标题,x轴,y轴内容 theme(plot.title = element_text(size = 15, colour = "black", hjust = 0.5), axis.title.y = element_text(size = 15, # family = "myFont", color = "black", face = "bold", vjust = 1.9, hjust = 0.5, angle = 90), legend.title = element_text(color="black", # 修改图例的标题 size=15, face="bold"), legend.text = element_text(color="black", # 设置图例标签文字 size = 10, face = "bold"), axis.text.x = element_text(size = 13, # 修改X轴上字体大小, color = "black", # 颜色 face = "bold", # face取值:plain普通,bold加粗,italic斜体,bold.italic斜体加粗 vjust = 0.5, # 位置 hjust = 0.5, angle = 0), #角度 axis.text.y = element_text(size = 13, color = "black", face = "bold", vjust = 0.5, hjust = 0.5, angle = 0) ) p 把Y轴截断把下半截设置成0.001到0.01上半截设置成1-8
09-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值