Julia散点图:基于点颜色添加图例及代码优化咨询
Julia PyPlot 分类绘图优化及正确图例添加方法
你当前图例重复的问题,是因为循环中每个数据点都设置了label,导致图例把每个点的标签都重复列出来了。下面提供两种解决方案,兼顾代码简洁性和大数据量效率:
方案一:按类别批量绘图(推荐,适合大数据量)
直接按类别分组筛选数据,批量绘制同类别点,每个类别仅添加一次标签,既高效又能生成正确图例:
using PyPlot # 定义类别与颜色的映射字典,替代原函数 color_map = Dict("male" => "blue", "female" => "red", "n/a" => "black") # 索引-类别映射 my_dict = Dict(1 => "male", 2 => "female", 3 => "male", 4 => "n/a", 5 => "male", 6 => "female") x = [1,2,3,4,5,6] y = [3,4,5,6,7,8] plt.figure(figsize=(14,2.5)) # 遍历每个类别,批量绘制对应数据点 for category in keys(color_map) # 筛选当前类别的所有索引 indices = [idx for idx in keys(my_dict) if my_dict[idx] == category] # 提取对应x、y数据 x_group = x[indices] y_group = y[indices] # 批量绘图,每个类别仅设置一次label plot(x_group, y_group, "o", color=color_map[category], label=category) end plt.legend() plt.show()
优化点说明
- 用
color_map直接映射类别与颜色,替代原point_colour函数,代码更简洁 - 按类别批量处理数据,避免循环每个点,对7255条数据的场景效率更高
- 每个类别仅添加一次
label,图例自动正确显示唯一类别
方案二:保留单循环逻辑(适合特殊场景)
如果需要保留逐个点绘制的逻辑,可以通过标记已出现的类别,仅在第一次遇到时设置标签,后续点隐藏图例:
using PyPlot my_dict = Dict(1 => "male",2 => "female",3=> "male", 4=> "n/a",5 => "male",6 => "female") color_map = Dict("male"=>"blue", "female"=>"red", "n/a"=>"black") x=[1,2,3,4,5,6] y=[3,4,5,6,7,8] plt.figure(figsize=(14,2.5)) # 记录已处理过的类别 seen_cats = Set() for i in 1:length(x) cat = my_dict[i] col = color_map[cat] # 仅首次出现该类别时设置正常标签,后续点不显示在图例 label = cat in seen_cats ? "_nolegend_" : cat plot(x[i], y[i], "o", color=col, label=label) push!(seen_cats, cat) end plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者sarl
相关产品推荐
相关产品推荐

