如何用Matplotlib为DataFrame散点图按Layer字段着色并添加图例
按Layer着色散点图并添加对应图例的解决方案
这里给你两种可行的解决方案,都能完美实现按层着色并生成对应图例的需求:
方法一:Matplotlib原生分组绘制
手动按layer分组,为每个组单独绘制散点并指定标签,这样matplotlib就能自动生成对应图例:
#Import Libraries import pandas as pd import numpy as np import matplotlib.pyplot as plt #Create Data data = {'y': [1,2,3,4,5,6,7,8,9,10], 'x': [1,2,3,4,5,6,7,8,9,10], 'layer' : ['a','a','a','b','b','b','c','c','c','c']} df=pd.DataFrame(data) # 获取所有唯一的层名称 unique_layers = df['layer'].unique() # 自动生成对应数量的颜色(用viridis配色,也可以手动指定颜色列表) colors = plt.cm.get_cmap('viridis', len(unique_layers)) # 遍历每个层,绘制散点并设置对应标签 for idx, layer in enumerate(unique_layers): # 筛选当前层的数据 subset = df[df['layer'] == layer] # 绘制散点,指定颜色和标签 plt.scatter(subset['x'], subset['y'], color=colors(idx), label=layer) # 添加图例、坐标轴标签 plt.legend(title='Layer') plt.xlabel('孔隙度') plt.ylabel('深度') plt.show()
方法二:用Seaborn简化操作
Seaborn的scatterplot可以直接通过hue参数指定分组列,自动完成着色和图例生成,代码更简洁:
#Import Libraries import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 导入seaborn库 #Create Data data = {'y': [1,2,3,4,5,6,7,8,9,10], 'x': [1,2,3,4,5,6,7,8,9,10], 'layer' : ['a','a','a','b','b','b','c','c','c','c']} df=pd.DataFrame(data) # 直接用hue参数按layer分组着色 sns.scatterplot(data=df, x='x', y='y', hue='layer', palette='viridis') # 添加标签和调整图例 plt.xlabel('孔隙度') plt.ylabel('深度') plt.legend(title='Layer') plt.show()
为什么之前的方法没生成正确图例?
如果直接给plt.scatter()的c参数传颜色列表,matplotlib只会把颜色当成数值映射,无法识别每个颜色对应的layer类别,自然生成不了对应图例。而上面两种方法都是明确把每个layer作为独立的绘图对象并指定标签,或者用Seaborn的分组逻辑,就能让图例和类别正确关联。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

