Matplotlib/pyplot:线型条件格式的简单方法?
Matplotlib/pyplot: easy way for conditional formatting of linestyle?
假设我想绘制两条相互交叉的实线,并且我只想绘制线 2 虚线,前提是它位于线 1 之上。这些线位于同一 x 网格上。 best/simplest 实现此目的的方法是什么?我可以在绘制之前将 line2 的数据拆分为两个相应的数组,但我想知道是否有更直接的方法使用某种条件线型格式?
最小示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,5,0.1)
y1 = 24-5*x
y2 = x**2
plt.plot(x,y1)
plt.plot(x,y2)#dashed if y2 > y1?!
plt.show()
有针对更复杂场景的相关问题,但我正在为这个标准案例寻找最简单的解决方案。有没有办法直接在 plt.plot() 中执行此操作?
你可以尝试这样的事情:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,5,0.1)
y1 = 24-5*x
y2 = x**2
xs2=x[y2>y1]
xs1=x[y2<=y1]
plt.plot(x,y1)
plt.plot(xs1,y2[y2<=y1])
plt.plot(xs2,y2[y2>y1],'--')#dashed if y2 > y1?!
plt.show()
@Sameeresque 很好地解决了它。
这是我的看法:
import numpy as np
import matplotlib.pyplot as plt
def intersection(list_1, list_2):
shortest = list_1 if len(list_1) < len(list_2) else list_2
indexes = []
for i in range(len(shortest)):
if list_1[i] == list_2[i]:
indexes.append(i)
return indexes
plt.style.use("fivethirtyeight")
x = np.arange(0, 5, 0.1)
y1 = 24 - 5*x
y2 = x**2
intersection_point = intersection(y1, y2)[0] # In your case they only intersect once
plt.plot(x, y1)
x_1 = x[:intersection_point+1]
x_2 = x[intersection_point:]
y2_1 = y2[:intersection_point+1]
y2_2 = y2[intersection_point:]
plt.plot(x_1, y2_1)
plt.plot(x_2, y2_2, linestyle="dashed")
plt.show()
与@Sammeresque 的原理相同,但我认为他的解决方案更简单。
假设我想绘制两条相互交叉的实线,并且我只想绘制线 2 虚线,前提是它位于线 1 之上。这些线位于同一 x 网格上。 best/simplest 实现此目的的方法是什么?我可以在绘制之前将 line2 的数据拆分为两个相应的数组,但我想知道是否有更直接的方法使用某种条件线型格式?
最小示例:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,5,0.1)
y1 = 24-5*x
y2 = x**2
plt.plot(x,y1)
plt.plot(x,y2)#dashed if y2 > y1?!
plt.show()
有针对更复杂场景的相关问题,但我正在为这个标准案例寻找最简单的解决方案。有没有办法直接在 plt.plot() 中执行此操作?
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,5,0.1)
y1 = 24-5*x
y2 = x**2
xs2=x[y2>y1]
xs1=x[y2<=y1]
plt.plot(x,y1)
plt.plot(xs1,y2[y2<=y1])
plt.plot(xs2,y2[y2>y1],'--')#dashed if y2 > y1?!
plt.show()
@Sameeresque 很好地解决了它。
这是我的看法:
import numpy as np
import matplotlib.pyplot as plt
def intersection(list_1, list_2):
shortest = list_1 if len(list_1) < len(list_2) else list_2
indexes = []
for i in range(len(shortest)):
if list_1[i] == list_2[i]:
indexes.append(i)
return indexes
plt.style.use("fivethirtyeight")
x = np.arange(0, 5, 0.1)
y1 = 24 - 5*x
y2 = x**2
intersection_point = intersection(y1, y2)[0] # In your case they only intersect once
plt.plot(x, y1)
x_1 = x[:intersection_point+1]
x_2 = x[intersection_point:]
y2_1 = y2[:intersection_point+1]
y2_2 = y2[intersection_point:]
plt.plot(x_1, y2_1)
plt.plot(x_2, y2_2, linestyle="dashed")
plt.show()
与@Sammeresque 的原理相同,但我认为他的解决方案更简单。