WedX - журнал о программировании и компьютерных науках

уникальный маркер сюжета для каждого сюжета в matplotlib

У меня есть цикл, в котором я создаю несколько графиков, и мне нужен уникальный маркер для каждого графика. Я думаю создать функцию, которая возвращает случайный символ, и использовать ее в своей программе следующим образом:

for i in xrange(len(y)):
    plt.plot(x, y [i], randomMarker())

но я думаю, что этот путь не является хорошим. Мне это нужно только для того, чтобы различать сюжеты на легенде, потому что сюжеты не должны быть связаны линиями, они должны быть просто набором точек.

26.10.2012

  • Действительно ли нужно, чтобы каждый маркер был другим, или вы просто хотите, чтобы ваши точки не были соединены линией? 26.10.2012
  • Мне нужно, чтобы каждый маркер был другим, и я хочу, чтобы точки не были соединены линиями. 26.10.2012

Ответы:


1

itertools.cycle будет перебирать список или кортеж бесконечно. Это предпочтительнее, чем функция, которая случайным образом выбирает маркеры для вас.

Питон 2.х

import itertools
marker = itertools.cycle((',', '+', '.', 'o', '*')) 
for n in y:
    plt.plot(x,n, marker = marker.next(), linestyle='')

Питон 3.х

import itertools
marker = itertools.cycle((',', '+', '.', 'o', '*')) 
for n in y:
    plt.plot(x,n, marker = next(marker), linestyle='')

Вы можете использовать это для создания такого графика (Python 2.x):

import numpy as np
import matplotlib.pyplot as plt
import itertools

x = np.linspace(0,2,10)
y = np.sin(x)

marker = itertools.cycle((',', '+', '.', 'o', '*')) 

fig = plt.figure()
ax = fig.add_subplot(111)

for q,p in zip(x,y):
    ax.plot(q,p, linestyle = '', marker=marker.next())
    
plt.show()

Пример графика

26.10.2012
  • +1, так как это показывает хороший способ, как это может работать с произвольным количеством графиков. Тот же метод работает с цветами и т. д. 26.10.2012
  • +1 Никогда не знал о itertools.cycle. Гораздо лучше, чем недоработанные схемы лямбда/модуль, которые я использовал раньше. 26.10.2012
  • Просто примечание для тех, кто использует Python 3.x: itertools.cycle.next был изменен на next(itertools.cycle()). См. stackoverflow.com/questions/5237611/itertools-cycle-next. 18.09.2014

  • 2

    Похоже, никто еще не упомянул встроенный метод pyplot для зацикливания свойств. Итак, вот оно:

    import numpy as np
    import matplotlib.pyplot as plt
    from cycler import cycler
    
    x = np.linspace(0,3,20)
    y = np.sin(x)
    
    fig = plt.figure()
    plt.gca().set_prop_cycle(marker=['o', '+', 'x', '*', '.', 'X']) # gca()=current axis
    
    for q,p in zip(x,y):
        plt.plot(q,p, linestyle = '')
    
    plt.show()
    

    Только цикл маркера

    Однако таким образом вы теряете цветовой цикл. Вы можете добавить задний цвет, умножая или добавляя цвет cycler и объект маркера cycler, например:

    fig = plt.figure()
    
    markercycle = cycler(marker=['o', '+', 'x', '*', '.', 'X'])
    colorcycle = cycler(color=['blue', 'orange', 'green', 'magenta'])
    # Or use the default color cycle:
    # colorcycle = cycler(color=plt.rcParams['axes.prop_cycle'].by_key()['color'])
    
    plt.gca().set_prop_cycle(colorcycle * markercycle) # gca()=current axis
    
    for q,p in zip(x,y):
        plt.plot(q,p, linestyle = '')
    
    plt.show()
    

    Маркер и цветовой цикл, объединенные умножением

    При добавлении циклов они должны иметь одинаковую длину, поэтому в этом случае мы используем только первые четыре элемента markercycle:

    plt.gca().set_prop_cycle(colorcycle + markercycle[:4]) # gca()=current axis
    

    Маркер и цветовой цикл объединены добавлением

    16.01.2020
  • Кажется, что не нужно импортировать модуль cycler и вместо этого можно использовать plt.cycler для той же цели. Например. mycyler = plt.cycler(marker=['o', '+'], color=['blue', 'orange']), а затем использовать его в методе set_prop_cycle() как обычно. 11.04.2021
  • Возможно, стоит упомянуть, что on также может добавлять циклеры, чтобы получить циклировщик, который изменяет несколько свойств каждый раз. 22.04.2021
  • @ПолГ. Не стесняйтесь добавлять пример, если хотите. 23.04.2021
  • @Fritz Как мой собственный ответ? Я думаю, что ваш достаточно хорош. Я просто думаю, что их добавление — важная функция для создания графиков, которые работают для людей с дальтонизмом или при печати в оттенках серого. Если вам нужно умножить циклеров, чтобы получить достаточно разных стилей, велика вероятность, что вы пытаетесь поместить слишком много информации в один сюжет;) 23.04.2021
  • @ПолГ. Я имел в виду как редактирование. Я стараюсь следовать политике Википедии «Будь смелым» при улучшении постов (просто делаю улучшение сам, а не предлагаю его). 24.04.2021
  • @Fritz Хотя мне нравится эта идея (и я добавил правку), я не хочу разбираться в вашем matplotlibrc. Поэтому мой пример выглядит иначе, и вы можете переделать его. Я должен был просто переделать все картинки? :D 25.04.2021
  • @ПолГ. Замечательно. Здесь не нужен перфекционизм. :-) 26.04.2021

  • 3

    Вы также можете использовать генерацию маркеров кортежем, например. в виде

    import matplotlib.pyplot as plt
    markers = [(i,j,0) for i in range(2,10) for j in range(1, 3)]
    [plt.plot(i, 0, marker = markers[i], ms=10) for i in range(16)]
    

    Подробнее см. на сайте документации по маркерам Matplotlib.

    Кроме того, это можно комбинировать с упомянутым выше циклом itertools.cycle.

    08.12.2016
  • Мне нравится этот ответ, потому что он позволяет увеличить разнообразие маркеров за счет увеличения числа в диапазоне. Тем не менее, в версии 2.0.2 это не работает, так как первое число тройки должно быть целым: (numsides, style, angle). Я бы исправил на: n = 16 и markers = [(2+i, 1+i%2, i/n*90.0) for i in range(1, n)]. 17.09.2017

  • 4

    Просто вручную создайте массив, содержащий символы маркера, и используйте его, например:

     markers=[',', '+', '-', '.', 'o', '*']
    
    26.10.2012
  • Хм, а как именно ты это используешь? Когда я пытаюсь ax.plot(t,s, marker=['s', 'o'], ...), я получаю TypeError: unhashable type: 'list' 22.05.2013
  • Это похоже на приведенные выше идеи, т. е. циклическое переключение по предопределенному предопределенному списку. Я не предполагал, что его можно использовать в качестве флага для plot(). 22.05.2013

  • 5
  • Привет, добро пожаловать в Stack Overflow. Отвечая на вопрос, на который уже есть много ответов, не забудьте добавить дополнительную информацию о том, почему ваш ответ является существенным, а не просто повторяет то, что уже проверено исходным автором. Это особенно важно в ответах только на код, таких как тот, который вы предоставили. 23.02.2019
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]