首页 > 解决方案 > 如何迭代散点图的列表并创建独特元素的图例

问题描述

背景:

我有一个list_of_x_and_y_list包含xy值,如下所示:

[[(44800, 14888), (132000, 12500), (40554, 12900)], [(None, 193788), (101653, 78880), (3866, 160000)]]

我有另一个data_name_list ["data_a","data_b"]这样

的/ 或len的> 20 。list_of_x_and_y_listlendata_name_list

问题:

如何为 中的每个项目(相同颜色)创建散点图data_name_list

我试过的:

   fig = plt.figure()
   ax = fig.add_subplot(1, 1, 1)
   ax = plt.axes(facecolor='#FFFFFF')
   prop_cycle = plt.rcParams['axes.prop_cycle']
   colors = prop_cycle.by_key()['color']

   print(list_of_x_and_y_list)
   for x_and_y_list, data_name, color in zip(list_of_x_and_y_list, data_name_list, colors):
       for x_and_y in x_and_y_list,:
          print(x_and_y)
          x, y = x_and_y
          ax.scatter(x, y, label=data_name, color=color) # "label=data_name" creates 
                                                         # a huge list as a legend! 
                                                         # :(


       plt.title('Matplot scatter plot')
       plt.legend(loc=2)
       file_name = "3kstc.png"
       fig.savefig(file_name, dpi=fig.dpi)
       print("Generated: {}".format(file_name))

问题:

图例似乎是一个很长的列表,我不知道如何纠正:

在此处输入图像描述

相关研究:

标签: python-3.xmatplotlibscatter-plot

解决方案


您获得长重复列表作为图例的原因是因为您将每个点作为单独的系列提供,因为matplotlib不会根据标签自动对数据进行分组。

一个快速的解决方法是遍历列表并将每个系列的 x 值和 y 值压缩为两个元组,以便x元组包含所有 x 值,y元组包含 y 值。

然后,您可以将这些元组plt.plot与标签一起提供给方法。

我觉得这些名称list_of_x_and_y_list冗长而复杂,所以在我的代码中我使用了较短的名称。

import matplotlib.pyplot as plt

data_series = [[(44800, 14888), (132000, 12500), (40554, 12900)],
               [(None, 193788), (101653, 78880), (3866, 160000)]]
data_names = ["data_a","data_b"]

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax = plt.axes(facecolor='#FFFFFF')
prop_cycle = plt.rcParams['axes.prop_cycle']
colors = prop_cycle.by_key()['color']

for data, data_name, color in zip(data_series, data_names, colors):
    x,y = zip(*data)
    ax.scatter(x, y, label=data_name, color=color)
    plt.title('Matplot scatter plot')
    plt.legend(loc=1)

输出


推荐阅读