Seaborn图例与绘图线条不匹配,颜色及线条样式异常求助
Seaborn绘图异常问题原因分析
问题代码
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt v_exponents = range(2, 9) vs = [2 ** exponent - 1 for exponent in v_exponents] df = pd.read_csv('data/out/erdos_renyi_graph/path_lengths_dfs/stats.csv') for v in vs: df_filtered = df[df['V'] == v] print(df_filtered) sns.lineplot(data=df_filtered, x="E", y="fraction_connected") plt.legend(title="V", labels=vs) plt.savefig(f'src/main/python/erdos_renyi_graph/path_lengths_dfs/doc/img/ErdosRenyiGraph-PathLengthsDFS.png')
运行后出现以下异常:
- 图例与绘图线条不匹配
- 线条粗细交替出现
- 同色线条重复出现
- 颜色仅显示蓝至红的渐变范围
异常原因
- 未利用Seaborn分组功能,循环重复绘图导致叠加:每次循环调用
sns.lineplot时,没有通过hue参数指定按V值分组,Seaborn会把每次绘制的线条当作独立系列。当循环次数超过默认调色板的颜色数量时,颜色会重复,同时多次绘制会导致同色线条出现两条。 - 手动设置图例与实际绘制的线条不对应:
plt.legend(title="V", labels=vs)是手动指定图例,但没有关联实际绘制的线条对象,而循环中绘制的线条数量和系列标识与手动设置的vs无法匹配,导致图例错位。 - 线条粗细交替是默认绘图样式的循环叠加:Seaborn默认会交替使用不同的线条样式(粗细、虚实等)来区分系列,多次调用
sns.lineplot会触发这种样式循环,从而出现线条粗细交替的现象。
修复方案
无需循环,直接通过hue参数让Seaborn自动按V值分组绘图,同时自动生成匹配的图例:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt v_exponents = range(2, 9) vs = [2 ** exponent - 1 for exponent in v_exponents] df = pd.read_csv('data/out/erdos_renyi_graph/path_lengths_dfs/stats.csv') # 过滤目标V值的数据 df_target = df[df['V'].isin(vs)] # 用hue指定分组字段,自动生成对应图例和颜色 sns.lineplot(data=df_target, x="E", y="fraction_connected", hue="V") plt.savefig(f'src/main/python/erdos_renyi_graph/path_lengths_dfs/doc/img/ErdosRenyiGraph-PathLengthsDFS.png')
内容的提问来源于stack exchange,提问作者Paul Reiners
相关产品推荐
相关产品推荐

