gpt4 book ai didi

python - 如何在matplotlib中绘制 "two directions widths line"

转载 作者:太空狗 更新时间:2023-10-29 22:29:20 26 4
gpt4 key购买 nike

如何使用 matplotlib 或 pyqtgraph 绘制绘图如下: two dirrections widths line

AB线是双向街道,绿色部分代表A点到B点的方向,红色部分代表B点到A点,各部分的宽度代表车流量。 宽度以点为单位,在不同的缩放级别或 dpi 设置下不会改变

这只是一个例子,事实上我有成百上千条街道。这种情节在很多交通软件中很常见。我尝试使用 matplotlib 的 patheffect 但结果令人沮丧:

from matplotlib import pyplot as plt
import matplotlib.patheffects as path_effects

x=[0,1,2,3]
y=[1,0,0,-1]
ab_width=20
ba_width=30

fig, axes= plt.subplots(1,1)
center_line, = axes.plot(x,y,color='k',linewidth=2)

center_line.set_path_effects(
[path_effects.SimpleLineShadow(offset=(0, -ab_width/2),shadow_color='g', alpha=1, linewidth=ab_width),
path_effects.SimpleLineShadow(offset=(0, ba_width/2), shadow_color='r', alpha=1, linewidth=ba_width),
path_effects.SimpleLineShadow(offset=(0, -ab_width), shadow_color='k', alpha=1, linewidth=2),
path_effects.SimpleLineShadow(offset=(0, ba_width), shadow_color='k', alpha=1, linewidth=2),
path_effects.Normal()])

axes.set_xlim(-1,4)
axes.set_ylim(-1.5,1.5)

enter image description here

我想到的一个想法是将线的每一部分作为独立的线,并在更改缩放级别时重新计算它的位置,但它太复杂且太慢。

是否有任何简单的方法可以使用 matplotlib 或 pyqtgraph 绘制我想要的东西?任何建议将不胜感激!

最佳答案

如果你可以有每条独立的线,这可以用 fill_between 轻松完成功能。

from matplotlib import pyplot as plt
import numpy as np

x=np.array([0,1,2,3])
y=np.array([1,0,0,-1])

y1width=-1
y2width=3
y1 = y + y1width
y2 = y + y2width

fig = plt.figure()
ax = fig.add_subplot(111)

plt.plot(x,y, 'k', x,y1, 'k',x,y2, 'k',linewidth=2)
ax.fill_between(x, y1, y, color='g')
ax.fill_between(x, y2, y, color='r')

plt.xlim(-1,4)
plt.ylim(-3,6)
plt.show()

在这里,我将中心线视为引用(因此为负 y1width ),但可以采用不同的方式。结果是:

<code>fill_between</code> result.

如果线条“复杂”,最终在某个点相交,则关键字参数 interpolate=True必须用于正确填充交叉区域。另一个可能对您的用例有用的有趣参数是 where , 以调节区域,例如 where=y1 < 0 .有关更多信息,您可以查看 documentation .

关于python - 如何在matplotlib中绘制 "two directions widths line",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37740160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com