Python 如何使两条线在一个循环中以相同的颜色绘制?

Python 如何使两条线在一个循环中以相同的颜色绘制?,python,matplotlib,plot,visualization,graphic-design,Python,Matplotlib,Plot,Visualization,Graphic Design,我想生成一个图表,显示同一图表上各种收敛方法/值的数值函数的误差 我使用while循环通过不同的收敛条件值递增,并在图上绘制误差,每个收敛方法(用后缀a和B标记)一次 问题是每次我在matplotlib中调用plot时,该行显示为不同的颜色。我希望每个收敛值使用相同的颜色(即,如果它们共享收敛值,则将线绘制为相同的颜色),以便读者更容易看到哪些线是连接的 我的代码当前生成的示例 然而,我希望每对中的彩色和黑色虚线颜色相同。我没有包括函数的定义,但是我用来生成图形的代码是 conv = 1e-0

我想生成一个图表,显示同一图表上各种收敛方法/值的数值函数的误差

我使用while循环通过不同的收敛条件值递增,并在图上绘制误差,每个收敛方法(用后缀a和B标记)一次

问题是每次我在matplotlib中调用plot时,该行显示为不同的颜色。我希望每个收敛值使用相同的颜色(即,如果它们共享收敛值,则将线绘制为相同的颜色),以便读者更容易看到哪些线是连接的

我的代码当前生成的示例

然而,我希望每对中的彩色和黑色虚线颜色相同。我没有包括函数的定义,但是我用来生成图形的代码是

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() 
conv=1e-0
h=0.1
当conv>1e-4时:
错误列表A,错误列表B=[],[]
gridsize=[]
网格x=40

而grid_x我会使用颜色贴图来自动定义颜色。但是,由于您事先不知道将有多少条曲线,因此我们可以绘制所有曲线,然后为它们着色

修改代码中的以下行:

# 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()前面的
plt.show()


您好,我试图实现您的解决方案,但它在ax.lines:“for n,enumerate(line)”行上抛出了一个语法错误:无法分配到函数调用错误。此外,我还知道将绘制多少条线,因为我知道最初的收敛是什么,以及每次循环后的变化量,我知道总共有十条线,五对。虽然我可能会把这个减少到四对。这是一个打字错误,我的错。我的意思是
对于n,枚举中的行(ax.lines):
@EliRees实际上忘记了它,我将方法改为更简单的方法。现在理解应该更好了!:)我的荣幸!请随意尝试其他颜色贴图,并摆弄它们的颜色值。您可以通过使用模或偏移量将其限制到贴图的某一部分,例如
colormap(-n/n%1)
colormap(n/n%0.5+0.5)
colormap(n/n/2)
,等等。
# 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)