如何让两条线在一个循环中绘制为相同的颜色?
How can I get two lines to plot as the same colour within a loop?
我想生成一个图表,显示同一图表上各种收敛的数值函数的误差 methods/values。
我正在使用 while 循环递增收敛条件的不同值,并在图表上绘制误差,每种收敛方法一次(标有后缀 A 和 B)。
问题是每次我在 matplotlib 中调用 plot 时,线条显示为不同的颜色。我希望每个收敛值都使用相同的颜色(即,如果线条共享收敛值,则将线条绘制为相同的颜色)以使 reader 更容易查看哪些线条已连接。
我的代码当前生成的示例。
而我希望每对中的彩色和黑色虚线颜色相同。我没有包括函数的定义,但我用来生成图表的代码是
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()
注意:我知道您可以手动设置线条的颜色作为参数,但我不确定如何在循环中执行此操作。
另外,如果有什么办法不让传说挡住剧情,那也是很有帮助的。
我会使用颜色图来自动定义颜色。但是,由于您事先不知道会有多少条曲线,我们可以绘制所有曲线并在之后为它们着色。
修改代码中的以下行:
# 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)
我想生成一个图表,显示同一图表上各种收敛的数值函数的误差 methods/values。
我正在使用 while 循环递增收敛条件的不同值,并在图表上绘制误差,每种收敛方法一次(标有后缀 A 和 B)。
问题是每次我在 matplotlib 中调用 plot 时,线条显示为不同的颜色。我希望每个收敛值都使用相同的颜色(即,如果线条共享收敛值,则将线条绘制为相同的颜色)以使 reader 更容易查看哪些线条已连接。
我的代码当前生成的示例。
而我希望每对中的彩色和黑色虚线颜色相同。我没有包括函数的定义,但我用来生成图表的代码是
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()
注意:我知道您可以手动设置线条的颜色作为参数,但我不确定如何在循环中执行此操作。
另外,如果有什么办法不让传说挡住剧情,那也是很有帮助的。
我会使用颜色图来自动定义颜色。但是,由于您事先不知道会有多少条曲线,我们可以绘制所有曲线并在之后为它们着色。
修改代码中的以下行:
# 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)