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

使用Seaborn绘制5000条pH时序数据图表遇问题求助

解决污水数据集Seaborn可视化问题及自动化图表方案

一、处理大数据集可视化的痛点(刻度拥挤+散点趋势异常)

1. 时间轴刻度拥挤

每周4-5k条数据大概率是分钟/小时级采样,直接绘图会导致X轴时间标签重叠,解决办法:

  • 自动调整刻度与格式化:借助matplotlib的日期工具类,让系统自动适配合适的刻度间隔,同时旋转标签避免重叠:
    import matplotlib.dates as mdates
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    fig, ax = plt.subplots(figsize=(12,6))
    sns.lineplot(data=df, x='Date', y='pH', ax=ax)
    # 设置X轴刻度为合理范围,自动调整
    ax.xaxis.set_major_locator(mdates.AutoDateLocator(minticks=5, maxticks=10))
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d %H:%M'))
    # 旋转标签45度,避免重叠
    plt.xticks(rotation=45)
    plt.tight_layout()
    
  • 降采样聚合:如果不需要看每一条数据的细节,按小时/半天聚合后再绘图,既减少数据量,又能更清晰展示趋势:
    # 按小时聚合pH均值
    df_hourly = df.resample('H', on='Date')['pH'].mean().reset_index()
    sns.lineplot(data=df_hourly, x='Date', y='pH')
    

2. 散点图趋势不符预期

4-5k个点堆叠在一起会出现严重重叠,导致趋势被掩盖,试试这些方法:

  • 降低点透明度:通过alpha参数让重叠区域颜色加深,能直观看到数据密度:
    sns.scatterplot(data=df, x='Date', y='pH', alpha=0.2)
    
  • 改用密度类图表:如果重点是看分布而非单个点,用六边形分箱图替代散点:
    sns.jointplot(data=df, x='Date', y='pH', kind='hex', height=8)
    
  • 降采样后再绘散点:和线图一样,聚合后的数据点更少,趋势更明确:
    df_daily = df.resample('D', on='Date')['pH'].median().reset_index()
    sns.scatterplot(data=df_daily, x='Date', y='pH')
    

二、周/月/年维度多指标图表自动化实现

核心思路是按时间维度聚合数据+批量生成子图,以下是可复用的方案:

1. 封装数据聚合函数

根据指定的时间频率(周/月/年),自动聚合所有指标的统计量(这里用均值,可按需替换为max/min等):

def aggregate_data(df, freq='W'):
    # 定义需要聚合的指标列
    metrics = ['水位', '流量', 'pH', '温度']
    # 按时间频率聚合,计算均值
    agg_df = df.resample(freq, on='Date')[metrics].mean().reset_index()
    # 给时间列重命名,方便后续绘图
    agg_df.rename(columns={'Date': f'{freq}_period'}, inplace=True)
    return agg_df

2. 批量生成多指标子图

用matplotlib的子图布局,一次性生成所有指标的趋势图,统一设置样式:

def plot_multi_metrics(agg_df, freq_name):
    metrics = ['水位', '流量', 'pH', '温度']
    # 创建2行2列的子图布局
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(16,10))
    axes = axes.flatten() # 把二维数组转成一维,方便循环
    
    for idx, metric in enumerate(metrics):
        ax = axes[idx]
        sns.lineplot(data=agg_df, x=f'{freq_name}_period', y=metric, ax=ax)
        ax.set_title(f'{metric}按{freq_name}变化趋势')
        ax.tick_params(axis='x', rotation=45)
        # 格式化时间轴
        ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
    
    plt.tight_layout()
    plt.savefig(f'{freq_name}_多指标趋势图.png') # 自动保存图片,用于报告

# 调用示例:生成周维度图表
weekly_df = aggregate_data(df, freq='W')
plot_multi_metrics(weekly_df, freq_name='周')

# 生成月维度图表
monthly_df = aggregate_data(df, freq='M')
plot_multi_metrics(monthly_df, freq_name='月')

3. 多指标对比进阶(可选)

如果需要在同一张图对比多个指标(注意数值范围差异),可以标准化后绘图,或者用双Y轴:

# 标准化指标(0-1范围),方便同图对比
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
weekly_df[['水位', '流量', 'pH', '温度']] = scaler.fit_transform(weekly_df[['水位', '流量', 'pH', '温度']])

fig, ax = plt.subplots(figsize=(12,6))
for metric in ['水位', '流量', 'pH', '温度']:
    sns.lineplot(data=weekly_df, x='W_period', y=metric, label=metric, ax=ax)

ax.set_title('周维度标准化指标对比')
ax.tick_params(axis='x', rotation=45)
ax.legend()
plt.tight_layout()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:53:15