Я хочу нарисовать график, используя список пар (x,y)
вместо использования двух списков, один из X и один из Y. Что-то вроде этого:
a = [[1,2],[3,3],[4,4],[5,2]]
plt.plot(a, 'ro')
Вместо
plt.plot([1,3,4,5], [2,3,4,2])
Предложения?
Я хочу нарисовать график, используя список пар (x,y)
вместо использования двух списков, один из X и один из Y. Что-то вроде этого:
a = [[1,2],[3,3],[4,4],[5,2]]
plt.plot(a, 'ro')
Вместо
plt.plot([1,3,4,5], [2,3,4,2])
Предложения?
Вы можете сделать что-то вроде этого:
a=[[1,2],[3,3],[4,4],[5,2]]
plt.plot(*zip(*a))
К сожалению, вы больше не можете передавать 'ro'. Вы должны передать значения маркера и стиля линии в качестве параметров ключевого слова:
a=[[1,2],[3,3],[4,4],[5,2]]
plt.plot(*zip(*a), marker='o', color='r', ls='')
Используемый трюк распаковка списков аргументов.
Если вы используете массив numpy, вы можете извлечь его по оси:
a = array([[1,2],[3,3],[4,4],[5,2]])
plot(a[:,0], a[:,1], 'ro')
Для списков или списков вам понадобится помощник, например:
a = [[1,2],[3,3],[4,4],[5,2]]
plot(*sum(a, []), marker='o', color='r')
список понятий
Я очень рекомендую либеральное применение переписных списков. Они не только кратки и мощны, они, как правило, делают ваш код очень удобочитаемым.
Попробуйте что-то вроде этого:
list_of_lists = [[1,2],[3,3],[4,4],[5,2]]
x_list = [x for [x, y] in list_of_lists]
y_list = [y for [x, y] in list_of_lists]
plt.plot(x_list, y_list)
Следует избегать распаковки аргументов. Это некрасиво.
Напишите вспомогательную функцию.
Вот длинная версия, но я уверен, что есть трюк, чтобы сжать ее.
>>> def helper(lst):
lst1, lst2 = [], []
for el in lst:
lst1.append(el[0])
lst2.append(el[1])
return lst1, lst2
>>>
>>> helper([[1,2],[3,4],[5,6]])
([1, 3, 5], [2, 4, 6])
>>>
Также добавьте этот помощник:
def myplot(func, lst, flag):
return func(helper(lst), flag)
И назовите его так:
myplot(plt.plot, [[1,2],[3,4],[5,6]], 'ro')
В качестве альтернативы вы можете добавить функцию к уже созданному объекту.