You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R/Python中绘制含多数据变量的X-Y折线图

别担心,基础问题完全没问题!我来帮你一步步搞定用R和Python绘制这类X-Y折线图,咱们先从R开始,再讲Python,都用最常用的工具包~

在R中绘制X-Y折线图

1. 先模拟你的数据集(贴合你的需求)

我先模拟一个和你描述匹配的数据集——包含4名患者、不同温度、时间点、血清/血浆样本的测量值,用tidyverse包的tibble来创建,结构清晰:

library(tidyverse)

# 设置随机种子保证结果可重复
set.seed(123) 
df <- tibble(
  PatientID = rep(paste0("Patient_", 1:4), each = 12),
  Temperature = rep(c(25, 37, 42), each = 4, times = 4),
  TimePoint = rep(c(0, 2, 6, 24), times = 12),
  SampleType = rep(c("Serum", "Plasma"), each = 24),
  Measurement = rnorm(48, mean = 50, sd = 8)
)

2. 用ggplot2绘制折线图

ggplot2是R里最常用的绘图工具,我们可以把患者、温度、样本类型这些维度都通过图形元素区分开,比如用颜色区分温度,线型区分样本类型,每个患者单独一个子图,这样对比起来更清楚:

ggplot(df, aes(x = TimePoint, y = Measurement, color = factor(Temperature), linetype = SampleType)) +
  # 确保每个患者-温度-样本的组合都有单独折线
  geom_line(aes(group = interaction(PatientID, Temperature, SampleType)), alpha = 0.7) + 
  # 加上数据点,让每个时间点的数值更直观
  geom_point(size = 2) + 
  # 每个患者单独一个子图,避免画面拥挤
  facet_wrap(~PatientID) + 
  # 设置标签和标题
  labs(
    x = "时间点(小时)",
    y = "测量值",
    color = "温度(℃)",
    linetype = "样本类型",
    title = "不同患者在不同温度、时间点的血清/血浆测量值"
  ) +
  # 用简洁的主题
  theme_minimal() +
  # 让标题居中
  theme(plot.title = element_text(hjust = 0.5))

如果你的实际数据集列名或者分组逻辑不一样,只要调整代码里的列名和aes里的映射关系就行~

在Python中绘制X-Y折线图

1. 模拟数据集(和R版本对应)

用pandas创建和R结构一致的数据集,方便对比:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 设置随机种子
np.random.seed(123)
patient_ids = [f"Patient_{i}" for i in range(1,5)] * 12
temperatures = [25,25,25,25,37,37,37,37,42,42,42,42] *4
time_points = [0,2,6,24]*12
sample_types = ["Serum"]*24 + ["Plasma"]*24
measurements = np.random.normal(loc=50, scale=8, size=48)

df = pd.DataFrame({
    "PatientID": patient_ids,
    "Temperature": temperatures,
    "TimePoint": time_points,
    "SampleType": sample_types,
    "Measurement": measurements
})

2. 用Seaborn+Matplotlib绘制折线图

Python里用seaborn做统计绘图很方便,搭配matplotlib调整细节:

# 设置画布大小
plt.figure(figsize=(12,8))
# 按患者分面,每行显示2个患者的图
g = sns.FacetGrid(df, col="PatientID", col_wrap=2, height=4)
# 绘制折线,颜色区分温度,线型区分样本类型,加上数据点
g.map_dataframe(sns.lineplot, x="TimePoint", y="Measurement", hue="Temperature", style="SampleType", marker="o", alpha=0.7)
# 添加温度的图例
g.add_legend(title="温度(℃)", bbox_to_anchor=(1.05, 1))
# 手动添加样本类型的图例(FacetGrid默认只显示hue的图例)
from matplotlib.lines import Line2D
custom_lines = [Line2D([0], [0], color='gray', linestyle='-', lw=2),
                Line2D([0], [0], color='gray', linestyle='--', lw=2)]
g.fig.legend(custom_lines, ['Serum', 'Plasma'], loc='upper right', bbox_to_anchor=(1.2, 1))

# 设置轴标签和总标题
g.set_axis_labels("时间点(小时)", "测量值")
g.fig.suptitle("不同患者在不同温度、时间点的血清/血浆测量值", y=1.05)
# 调整布局避免元素重叠
plt.tight_layout()
plt.show()

同样,如果你的实际数据结构不同,修改对应的列名和参数就可以适配啦~

内容的提问来源于stack exchange,提问作者Lothlorian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:53:09