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

Matplotlib图例标签与颜色错位及Seaborn绘图报错排查

Fixing Matplotlib Legend Mismatch & Seaborn lineplot ValueError

Let's break down your two issues one by one and fix them with concrete code examples, starting with a sample DataFrame that matches your multi-Vstart/Vend structure.

First, let's create a realistic test dataset to work with:

import pandas as pd
import numpy as np

# Sample DataFrame with 3 voltage groups (29V, 30V, 31V), each with Vstart/Vend columns
rse_df = pd.DataFrame({
    'Vstart_29': np.random.randn(10).cumsum(),
    'Vend_29': np.random.randn(10).cumsum(),
    'Vstart_30': np.random.randn(10).cumsum(),
    'Vend_30': np.random.randn(10).cumsum(),
    'Vstart_31': np.random.randn(10).cumsum(),
    'Vend_31': np.random.randn(10).cumsum()
})

1. Fixing Matplotlib Legend Label-Color Mismatch

What's causing the issue?

Your legend is misaligned because you're either:

  • Adding all legend labels in a single list that doesn't match the order of lines you plotted, or
  • Forgetting to assign label parameters directly to each line, leading Matplotlib to auto-generate legends in the wrong sequence.

Correct Code

Assign a label to every line you plot, then call plt.legend() without manually passing labels—this ensures Matplotlib maps each line's color to its correct label:

import matplotlib.pyplot as plt

plt.figure(figsize=(10, 6))
voltages = [29, 30, 31]
colors = ['blue', 'green', 'pink']  # Match these to your desired color scheme

for volt, color in zip(voltages, colors):
    # Plot Vstart with solid line and explicit label
    plt.plot(rse_df[f'Vstart_{volt}'], color=color, label=f'Vstart={volt}V')
    # Plot Vend with dashed line and explicit label
    plt.plot(rse_df[f'Vend_{volt}'], color=color, linestyle='--', label=f'Vend={volt}V')

# Auto-generate legend using the labels assigned to each line
plt.legend(title='Voltage Series')
plt.xlabel('X Axis (e.g., Time/Iterations)')
plt.ylabel('Value')
plt.title('Vstart vs Vend by Voltage')
plt.show()

This way, each line's color and label are paired from the start, eliminating any mismatch.


2. Fixing Seaborn lineplot ValueError: "If using all scalar values, you must pass an index"

What's causing the issue?

Seaborn's lineplot requires tidy (long-form) data and expects x/y inputs to be sequences (like columns, lists, or Series)—not single scalar values. Your error happens when you pass individual numbers instead of iterable data, or when working with wide-form DataFrames (where each voltage's Vstart/Vend is a separate column) without restructuring.

Correct Code

First, convert your wide-form DataFrame to tidy long-form, then plot using Seaborn's built-in grouping features:

import seaborn as sns

# Step 1: Convert wide-form DataFrame to tidy long-form
melted_df = rse_df.melt(var_name='Series', value_name='Value', ignore_index=False)
# Split the 'Series' column to separate type (Vstart/Vend) and voltage
melted_df[['Type', 'Voltage']] = melted_df['Series'].str.split('_', expand=True)
melted_df['Voltage'] = melted_df['Voltage'].astype(int)  # Convert voltage to numeric

# Step 2: Plot with Seaborn
plt.figure(figsize=(10, 6))
sns.lineplot(
    data=melted_df,
    x=melted_df.index,  # Use your actual x-axis variable here (e.g., 'Time')
    y='Value',
    hue='Voltage',      # Group by voltage (colors)
    style='Type',       # Differentiate Vstart/Vend with line styles
    palette=colors      # Match your color scheme
)

plt.legend(title='Series Details')
plt.xlabel('X Axis (e.g., Time/Iterations)')
plt.ylabel('Value')
plt.title('Vstart vs Vend by Voltage (Seaborn)')
plt.show()

If you ever need to plot a single series, make sure you pass a sequence (e.g., y=rse_df['Vstart_29'] instead of a single scalar like y=29).


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:21:24