如何在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
相关产品推荐
相关产品推荐

