如何手动设置Seaborn/Matplotlib散点图连续变量(hue)的图例值?
自定义Seaborn散点图连续变量图例的显示数值
当然可以手动指定连续变量(hue)对应的图例显示数值。针对你的需求,这里提供两种可行方案:
方案1:用颜色条展示自定义刻度(推荐用于连续变量)
关闭Seaborn默认图例,借助Matplotlib的ScalarMappable创建自定义颜色条,直接指定要显示的刻度值:
import numpy as np import matplotlib.pyplot as plt from matplotlib.cm import ScalarMappable import seaborn as sns np.random.seed(123) x = np.random.randn(500) y = np.random.randn(500) z = np.random.exponential(1, 500) fig, ax = plt.subplots() hue_norm = (0, 3) palette = 'coolwarm' # 绘制散点图,关闭默认图例 sns.scatterplot( x=x, y=y, hue=z, hue_norm=hue_norm, palette=palette, legend=False ) # 创建与散点图匹配的颜色映射和归一化规则 norm = plt.Normalize(*hue_norm) cmap = plt.get_cmap(palette) # 创建用于生成颜色条的映射对象 sm = ScalarMappable(norm=norm, cmap=cmap) sm.set_array([]) # 添加自定义颜色条,指定要显示的刻度 cbar = plt.colorbar(sm, ax=ax, ticks=[0, 1, 2, 3]) cbar.set_label('z') ax.grid() ax.set(xlabel="x", ylabel="y") sns.despine() plt.show()
方案2:用离散标记展示自定义图例(匹配原图例样式)
如果希望保留原图例的离散标记样式,可手动创建代理标记并添加自定义图例:
import numpy as np import matplotlib.pyplot as plt import seaborn as sns from matplotlib.lines import Line2D np.random.seed(123) x = np.random.randn(500) y = np.random.randn(500) z = np.random.exponential(1, 500) fig, ax = plt.subplots() hue_norm = (0, 3) palette = 'coolwarm' # 绘制散点图,关闭默认图例 sns.scatterplot( x=x, y=y, hue=z, hue_norm=hue_norm, palette=palette, legend=False ) # 创建颜色映射和归一化规则 norm = plt.Normalize(*hue_norm) cmap = plt.get_cmap(palette) # 定义要显示的目标刻度值 target_ticks = [0, 1, 2, 3] # 为每个刻度创建对应的散点标记 custom_legend = [] for tick in target_ticks: color = cmap(norm(tick)) marker = Line2D([0], [0], marker='o', color='w', markerfacecolor=color, markersize=10, label=str(tick)) custom_legend.append(marker) # 添加自定义图例 ax.legend(handles=custom_legend, title='z') ax.grid() ax.set(xlabel="x", ylabel="y") sns.despine() plt.show()
两种方案都能让图例准确显示[0,1,2,3]对应的颜色,你可以根据可视化需求选择。
内容的提问来源于stack exchange,提问作者dfried
相关产品推荐
相关产品推荐

