Как я могу получить две линии одного цвета в пределах oop? - PullRequest
3 голосов
/ 10 февраля 2020

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

Я использую некоторое время l oop, чтобы увеличивать различные значения условия сходимости и отображать ошибку на графике, один раз для каждого метода сходимости (помеченного суффиксом A и B).

Проблема в том, что каждый раз, когда я вызываю plot в matplotlib, строка отображается другим цветом. Я хочу, чтобы один и тот же цвет для каждого значения конвергенции (ie отображал линии одним цветом, если они имеют общее значение конвергенции), чтобы читателю было легче видеть, какие линии связаны.

Пример того, что мой код в настоящее время производит.

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

conv = 1e-0
h=0.1

while conv>1e-4:

    errorlist_A, errorlist_B = [],[]
    gridsize = []
    grid_x = 40


    while grid_x <= 100:

        analytical = (np.ones((grid_x,grid_x)))*edge_val
        P = np.zeros((grid_x,grid_x))

        gridsize.append(grid_x)


        solA = solvelap_avg_rand(grid_x,grid_x,edge_val,P,h,conv)
        solB = solvelap_max_rand(grid_x,grid_x,edge_val,P,h,conv)

        errorlist_A.append(errorfunc(grid_x,grid_y,analytical,solA,edge_val))
        errorlist_B.append(errorfunc(grid_x,grid_y,analytical,solB,edge_val))

        grid_x +=5
        print(grid_x)

    plt.plot(gridsize,errorlist_A, label = "{0:.1g}".format(conv))
    plt.plot(gridsize,errorlist_B, label = "{0:.1g}".format(conv) , linestyle = "--", color = "k")

    conv *=0.1


plt.title("Fig:6 Error per Node Vs. Grid Width")
plt.xlabel("Grid Width")
plt.ylabel("Average Error Per Node (Log10)")
plt.yscale("log")
plt.legend()
plt.show() 

Примечание: я знаю, что вы можете установить цвета линий вручную в качестве аргумента , но я не уверен, как это сделать в al oop.

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

1 Ответ

4 голосов
/ 10 февраля 2020

Я бы использовал карту цветов для автоматического определения цвета. Однако, поскольку вы заранее не знаете, сколько будет кривых, мы можем построить все кривые и затем раскрасить их.

Измените следующие строки в вашем коде:

# Remove the `color=` parameter here, it will be overwritten anyway.
plt.plot(gridsize, errorlist_A, label="{0:.1g}".format(conv))
plt.plot(gridsize, errorlist_B, label="{0:.1g}".format(conv), linestyle = "--")

Затем добавьте их прямо перед plt.show():

# After you plotted them, apply a random color to each curve.
import matplotlib.cm as cm
colormap = cm.get_cmap("plasma") # The various colormaps can be found here: https://matplotlib.org/3.1.0/tutorials/colors/colormaps.html
ax = plt.gca()
lines = ax.lines
N = len(lines)
for n in range(0, N, 2): # For each two-lines made via `plt.plot(...)`:
    random_color = colormap(n/N) # This function takes a number between 0 and 1 and returns a color.
    lines[n].set_color(random_color)
    lines[n+1].set_color(random_color)

enter image description here

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