Чтобы получить только одну запись для data_name, вы должны добавить data_name только один раз в качестве метки. Остальные звонки должны go с label=None
. Простейшее, чего вы можете добиться, используя текущий код, это установить для data_name значение None
в конце l oop:
from matplotlib import pyplot as plt
from random import randint
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.set_facecolor('#FFFFFF')
# create some random data, suppose the sublists have different lengths
list_of_x_and_y_list = [[(randint(1000, 4000), randint(2000, 5000)) for col in range(randint(2, 10))]
for row in range(10)]
data_name_list = list('abcdefghij')
colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
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 :
x, y = x_and_y
ax.scatter(x, y, label=data_name, color=color)
data_name = None
plt.legend(loc=2)
plt.show()
Некоторые вещи можно упростить, сделав код «более pythoni» c ', например:
for x_and_y in x_and_y_list :
x, y = x_and_y
можно записать как:
for x, y in x_and_y_list:
Другая проблема заключается в том, что при большом количестве данных для каждой точки может быть вызван scatter
довольно медленно Все x и y, принадлежащие одному и тому же списку, можно построить вместе. Например, используя понимание списка :
for x_and_y_list, data_name, color in zip(list_of_x_and_y_list, data_name_list, colors):
xs = [x for x, y in x_and_y_list]
ys = [y for x, y in x_and_y_list]
ax.scatter(xs, ys, label=data_name, color=color)
scatter
можно даже получить список цветов на точку, но построение всех точек в одном go не позволит меток на data_name
.
Очень часто numpy используется для хранения числовых данных. Это имеет некоторые преимущества, такие как векторизация для быстрых вычислений. С numpy код будет выглядеть так:
import numpy as np
for x_and_y_list, data_name, color in zip(list_of_x_and_y_list, data_name_list, colors):
xys = np.array(x_and_y_list)
ax.scatter(xys[:,0], xys[:,1], label=data_name, color=color)