【问题标题】:How can I get two lines to plot as the same colour within a loop?如何在循环中将两条线绘制为相同的颜色?
【发布时间】:2020-05-26 03:54:06
【问题描述】:

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

我正在使用 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() 

注意:我知道您可以手动将线条的颜色设置为参数,但我不确定如何在循环中执行此操作。

此外,如果有任何方法可以防止图例阻塞情节,那也将非常有帮助。

【问题讨论】:

    标签: python matplotlib plot visualization graphic-design


    【解决方案1】:

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

    修改代码中的以下几行:

    # 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)
    

    【讨论】:

    • 您好,我尝试实施您的解决方案,但它在“for n, enumerate(line) in ax.lines:”行抛出了 SyntaxError: can't assign to function call 错误。另外,我会知道将绘制多少条线,因为我知道收敛最初是什么以及在每个循环之后它会发生多少变化,我知道总共会有十条线,五对。虽然我可能会减少到四对。
    • 这是一个错字,我的错。我的意思是for n, line in enumerate(ax.lines):
    • @EliRees 其实算了吧,我把方法改成了更简单的方法。现在应该更好理解了! :)
    • 我的荣幸!随意尝试其他颜色图并调整它们的颜色值。您可以使用模数或偏移量将其限制在地图的某个部分,例如colormap(-n/N % 1)colormap(n/N%0.5 + 0.5)colormap(n/N/2) 等。
    猜你喜欢
    • 2015-05-01
    • 2015-03-18
    • 2019-10-02
    • 1970-01-01
    • 2023-03-10
    • 2023-03-19
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多