Как реализовать автоматическую смену цвета в matplotlib с помощью сюжетов? - PullRequest
0 голосов
/ 28 ноября 2018

Я рисую диаграммы с помощью matplotlib.Когда я рисую его на том же графике с этим кодом:

def draw0(x, ys, labels):


    plt.suptitle("big title")

    i =0
    for y in ys:
        plt.plot(x, y, label=labels[i])
        plt.scatter(x, y)  # dots
        plt.xticks(range(1, max(x) + 1))
        plt.grid(True)
        i+=1

    plt.figlegend(loc="upper left")

    plt.show()

    return

x = [1,2,3,4,5]
y1 = [1,3,5,7,9]
y2 = [10,30,50,70,90]
y3 = [0.1,0.3,0.5,0.7,0.9]

draw0(x, [y1, y2, y3], ["chart1", "chart2", "chart3"])

все работает отлично. диаграммы в одном окне Но мне нужно, чтобы каждая диаграмма была на отдельном участке.

Я пытаюсь сделать это так:

def draw11(x, ys, labels):

    plt.figure()

    plt.suptitle("big title")

    i =0
    for y in ys:
        if i == 0:
            ax = plt.subplot(len(ys),1, i+1)
        else:
            plt.subplot(len(ys), 1, i + 1, sharex=ax)
        plt.plot(x, y, label=labels[i])
        plt.scatter(x, y)  # dots
        plt.xticks(range(1, max(x) + 1))
        plt.grid(True)
        i+=1

    plt.figlegend(loc="upper left")

    plt.show()

    return

Я получаю это.

диаграммы в подлотах

Проблема в том, что все диаграммы имеют одинаковый цвет.И легенда бесполезна.Как я могу добавить автоматическое управление цветом для всех подлотов?Я бы хотел, чтобы там не были такие же цвета.Как subplot1.chart1 = цвет1, subplo1.chart2 = цвет2, sublot2.chart1 = цвет3, а не цвет1.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Matplotlib имеет встроенное свойство cycler, которое по умолчанию содержит 10 цветов для циклического повторения.Тем не менее, эти циклы по осям.Если вы хотите циклически перемещаться по вспомогательным участкам, вам нужно будет использовать циклер и получать из него новый цвет для каждого вспомогательного участка.

import matplotlib.pyplot as plt
colors = plt.rcParams["axes.prop_cycle"]()

def draw11(x, ys, labels):
    fig, axes = plt.subplots(nrows=len(ys), sharex=True)
    fig.suptitle("big title")

    for ax, y, label in zip(axes.flat, ys, labels):
        # Get the next color from the cycler
        c = next(colors)["color"]

        ax.plot(x, y, label=label, color=c)
        ax.scatter(x, y, color=c)  # dots
        ax.set_xticks(range(1, max(x) + 1))
        ax.grid(True)

    fig.legend(loc="upper left")
    plt.show()


x = [1,2,3,4,5]
y1 = [1,3,5,7,9]
y2 = [10,30,50,70,90]
y3 = [0.1,0.3,0.5,0.7,0.9]

draw11(x, [y1, y2, y3], ["chart1", "chart2", "chart3"])

enter image description here

0 голосов
/ 28 ноября 2018

Просто есть список цветов и выберите их для каждого plt.plot и plt.scatter.

colors = ['orange', 'cyan', 'green']
i =0
for y in ys:
        if i == 0:
            ax = plt.subplot(len(ys),1, i+1)
        else:
            plt.subplot(len(ys), 1, i + 1, sharex=ax)
        plt.plot(x, y, label=labels[i], c=colors[i])
        plt.scatter(x, y, c=colors[i])  # dots
        plt.xticks(range(1, max(x) + 1))
        plt.grid(True)
        i+=1
...