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

Plotly散点图展示负值遇阻:绝对值转换失败求助

Plotly散点图展示负值问题排查与解决

你的数据集包含正负mean_score值:

word                    mean_score         headline_count
0   Agilent Technologies    0.248711           1
1   Apple                  -0.366803145021645  462

你误以为Plotly散点图不支持负值,尝试用abs()转换但代码未达预期,当前代码因逻辑错误导致数据丢失,无法正常展示目标内容。

核心误区纠正

Plotly散点图完全支持负值,y轴可以正常渲染负数值,不需要强制转换为绝对值。

代码问题分析

你的代码中这一行逻辑存在明显错误:

df_filtered = df_filtered[df_filtered['mean_score'] < 0.0].abs()

这行先筛选出所有mean_score为负的行,再对整行取绝对值,直接丢掉了所有正值数据;如果数据中没有负值行,df_filtered会变成空表,自然无法展示任何内容。

修正方案

方案1:直接展示正负值(推荐)

保留原始mean_score的正负属性,Plotly可以正常渲染,还能通过颜色区分正负值,增强图表可读性:

def plot_scatter_chart_for_all(file_name, threshold_score, min_headlines_count):
    import os
    import pandas as pd
    import plotly.express as px

    # 用os.path.join避免不同操作系统的路径拼接错误
    file_path = os.path.join(os.getcwd(), "data", file_name)
    df = pd.read_csv(file_path, sep="\t")
    
    # 合并筛选条件,避免多次赋值导致的逻辑混乱
    df_filtered = df[(abs(df['mean_score']) >= threshold_score) & (df['headline_count'] >= min_headlines_count)]
    
    # 添加列区分正负值,用于图表颜色映射
    df_filtered['score_sign'] = df_filtered['mean_score'].apply(lambda x: '正值' if x > 0 else '负值')
    
    fig = px.scatter(df_filtered, 
                     x='headline_count', 
                     y='mean_score', 
                     size=df_filtered['mean_score'].abs(),  # 用绝对值作为尺寸,避免负值导致散点尺寸异常
                     color='score_sign',
                     hover_data=['mean_score', 'headline_count', 'word'])
    
    fig.update_layout(yaxis_title="Mean Score")
    return fig

方案2:将负值转为绝对值,但保留原始值在hover中

如果确实需要把y轴显示为绝对值,但想在hover时看到原始正负值,可以新增一列存储绝对值,不覆盖原始数据:

def plot_scatter_chart_for_all(file_name, threshold_score, min_headlines_count):
    import os
    import pandas as pd
    import plotly.express as px

    file_path = os.path.join(os.getcwd(), "data", file_name)
    df = pd.read_csv(file_path, sep="\t")
    
    df_filtered = df[(abs(df['mean_score']) >= threshold_score) & (df['headline_count'] >= min_headlines_count)]
    
    # 新增绝对值列,保留原始mean_score用于hover展示
    df_filtered['abs_mean_score'] = df_filtered['mean_score'].abs()
    
    fig = px.scatter(df_filtered, 
                     x='headline_count', 
                     y='abs_mean_score', 
                     size='abs_mean_score',
                     hover_data=['mean_score', 'abs_mean_score', 'headline_count', 'word'])
    
    fig.update_layout(yaxis_title="Absolute Mean Score")
    return fig

额外优化点

  • 使用os.path.join拼接路径,避免Windows/Linux路径分隔符差异导致的错误
  • 合并筛选条件为一次赋值,简化逻辑减少出错概率
  • 散点尺寸用绝对值,避免Plotly自动忽略负值尺寸导致的显示异常

内容的提问来源于stack exchange,提问作者Mr.Eboy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:35:18