Одна "фигура", много "осей", одна "проп_цикл" - PullRequest
0 голосов
/ 08 декабря 2018

Ответ на знаменитый вопрос «Как получить разноцветные линии для разных графиков на одной фигуре?» Я наткнулся на поведение, которое меня озадачило...

Проблема в том, чтобы получить разные цвета линий на разных участках, например:

In [29]: import numpy as np 
    ...: import matplotlib.pyplot as plt                                                  

In [30]: fig, axes = plt.subplots(2,1)                                                    

In [31]: for ax in axes.flatten(): 
    ...:     ax.plot((0,1), (0,1))                                                        

enter image description here

Как вы можете видетьобе строки синие - я могу понять, что это происходит потому, что у каждого ax есть свой prop_cycle.

. Я могу решить проблему, используя явное имя цвета

In [44]: fig, axes = plt.subplots(2,1)                                                    

In [45]: for ax, short_color_name in zip(axes.flatten(), 'brgkyc'): 
    ...:     ax.plot((0,1), (0,1), short_color_name)                                      

enter image description here

но если я попытаюсь повторно использовать один и тот же cycler объект ...

In [47]: my_cy = plt.rcParams['axes.prop_cycle']                                          

In [48]: for ax in axes.flatten(): 
    ...:     ax.set_prop_cycle(my_cy) 
    ...:     ax.plot((0,1), (0,1))                                                        

, я получу два вспомогательных участка с двумя синими линиями ...

В моем понимании, то, что я хотел бы сделать, невозможно, потому что ax вызывает цикл, который возвращает itertools.cycle, который в свою очередь фактически производит kwargs при необходимости,но я все равно спрашиваю, потому что

В Matplotlib есть больше вещей, чем я мечтал в моей философии.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Моя рекомендация, если у вас есть только один исполнитель для стиля, будет

import matplotlib.pyplot as plt

fig, axes = plt.subplots(2,2)
cycler = plt.rcParams['axes.prop_cycle']()

for i, ax in enumerate(axes.flat):
    ax.plot((0,1), (0,1), **next(cycler))

plt.show()
0 голосов
/ 08 декабря 2018

По запросу этого комментария я хотел бы предложить

...
next_shared_style = plt.rcParams['axes.prop_cycle']().__next__
for i, ax in enumerate(axes):
    ax.plot(x, y[i], **next_shared_style())

, где

  • plt.rcParams['axes.prop_cycle'] - это cycler объект,
  • plt.rcParams['axes.prop_cycle']() возвращает объект itertools.cycle, а
  • next_shared_style = plt.rcParams['axes.prop_cycle']().__next__ - это метод __next__ объекта itertools.cycle.

Каждый вызов next(my_cycle_object_as_instantiated_by_a_cycler) возвращает словарь параметров, чтобы правильно передать этот словарь в команду pyplot для печати, нам нужно просто распаковать его, как в
plot(x, y[i], **next_shared_style()).

ИспользованиеВесь словарь гарантирует, что каждый субплот разделяет один и тот же цикл по всем атрибутам , которые контролируются prop_cycle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...