当前位置: 首页 > 面试题库 >

在Matplotlib中将带色图和注释箭头一起使用

郎羽
2023-03-14
问题内容

我已经看到了许多在Matplotlib中使用带有指定颜色的注释箭头的示例。我想知道是否有可能改为根据颜色图设置颜色,以便将指定颜色图的整个颜色范围显示在单个箭头上。我知道可以从颜色图中将箭头的颜色设置为单一颜色,但是我想让单个箭头显示给定颜色图的所有颜色。

下面显示了一个使用注释箭头的简单示例。在文档中,我没有找到指定颜色图的任何方法。如果我天真地指定了颜色图,则会从无效的RGBA参数中收到错误消息

import matplotlib.pyplot as plt

RdPu = plt.get_cmap('RdPu')

ax = plt.subplot(111)
ax.annotate("Test", xy=(0.2, 0.2), xycoords='data',
    xytext=(0.8, 0.8), textcoords='data',
    size=20, arrowprops=dict(color=RdPu),
)

plt.show()

问题答案:

好的,我们来制作 《彩虹之箭》 。;-)
当然,没有内置的方法可以用颜色渐变为箭头着色。相反,需要手动构建箭头。我可以想到两个选择。(1)创建一个颜色渐变,并使用箭头的圆周路径进行裁剪。(2)制作一个LineCollection具有渐变色的,然后向其添加一个箭头。

以下是第二个选项:

import matplotlib.pyplot as plt
import matplotlib.transforms
import matplotlib.path
import numpy as np
from matplotlib.collections import LineCollection

def rainbowarrow(ax, start, end, cmap="viridis", n=50,lw=3):
    cmap = plt.get_cmap(cmap,n)
    # Arrow shaft: LineCollection
    x = np.linspace(start[0],end[0],n)
    y = np.linspace(start[1],end[1],n)
    points = np.array([x,y]).T.reshape(-1,1,2)
    segments = np.concatenate([points[:-1],points[1:]], axis=1)
    lc = LineCollection(segments, cmap=cmap, linewidth=lw)
    lc.set_array(np.linspace(0,1,n))
    ax.add_collection(lc)
    # Arrow head: Triangle
    tricoords = [(0,-0.4),(0.5,0),(0,0.4),(0,-0.4)]
    angle = np.arctan2(end[1]-start[1],end[0]-start[0])
    rot = matplotlib.transforms.Affine2D().rotate(angle)
    tricoords2 = rot.transform(tricoords)
    tri = matplotlib.path.Path(tricoords2, closed=True)
    ax.scatter(end[0],end[1], c=1, s=(2*lw)**2, marker=tri, cmap=cmap,vmin=0)
    ax.autoscale_view()

fig,ax = plt.subplots()
ax.axis([0,5,0,4])
ax.set_aspect("equal")

rainbowarrow(ax, (3,3), (2,2.5), cmap="viridis", n=100,lw=3)
rainbowarrow(ax, (1,1), (1.5,1.5), cmap="jet", n=50,lw=7)
rainbowarrow(ax, (4,1.3), (2.7,1.0), cmap="RdYlBu", n=23,lw=5)

plt.show()

以下是旧的解决方法,造成误会

注释箭头是单个箭头。因此,您将需要分别绘制任意数量的箭头。为了使每个箭头都能获得颜色,可以使用arrowprops=dict(color="<somecolor>")参数。

要从颜色图获取颜色,可以使用值调用颜色图。在这里,箭头的长度可以视为要编码为颜色的数量。

import matplotlib.pyplot as plt
import numpy as np

RdPu = plt.get_cmap('RdPu')

ax = plt.subplot(111)
ax.axis([-6,2,-4.5,3.2])
ax.set_aspect("equal")

X = np.linspace(0,1,17, endpoint=False)
Xt =np.sin(2.5*X+3)
Yt = 3*np.cos(2.6*X+3.4)

Xh = np.linspace(-0.5,-5,17)
Yh = -1.3*Xh-5

#Distance
D = np.sqrt((Xh-Xt)**2+(Yh-Yt)**2)
norm = plt.Normalize(D.min(), D.max())

for xt, yt, xh, yh, d in zip(Xt,Yt,Xh,Yh,D):
    ax.annotate("Test", xy=(xh,yh), xycoords='data',
                xytext=(xt,yt), textcoords='data',
                size=10, arrowprops=dict(color=RdPu(norm(d))))

plt.show()


 类似资料:
  • 问题内容: 我有一个线图,我想用箭头而不是线来绘制。那个 是,连续对点之间的直线应该是从 从第一点到第二点。 我知道“arrow”函数,但这似乎只适用于单个箭头。 在我想办法用这个来完成整个情节之前,有没有一个 更好的方法? 问题答案: 你可以用 颤动, 但是要把关键字参数弄对有点棘手。

  • 我使用AWS加密客户端。下面的代码抛出错误为 错误:@DoNotTouch不适用于现场 然而,如果我给出@DoNotTouch配置,如下所示[使用getter和setter] 这很好用。我猜lombok生成的getter和setter不会被AmazoneCryptionClient识别 我在跟踪这个aws doc:https://aws.amazon.com/blogs/developer/cli

  • 问题内容: 我有一个使用自动装配的3个不同类的A类 在测试它们时,我只希望将其中两个类(B&C)作为模拟,并让D类在正常运行时可以自动装配,但此代码对我不起作用: 甚至有可能这样做吗? 问题答案: 应该是这样的 如果您不想成为别人,则无需在课堂上做任何事情。您 应具有的正确实例。此外,我认为你需要使用的工作,用正确的设定。因为您没有使用,所以需要使用 MockitoAnnotations.init

  • 问题内容: 我在一个Angular示例中遇到了这个构造,我想知道为什么选择了这个构造: 我了解变量_表示不在乎/不使用,但是由于它是唯一的变量,因此没有任何理由更喜欢使用_: 当然,输入的字符数不能少于一个。在我看来,()语法可以更好地传达意图,并且还更具体地说明类型,因为否则我认为第一个示例应该看起来像这样: 万一重要,这是使用它的上下文: 问题答案: 之所以可以使用此样式(可能是在此处使用该样

  • 我可以使用注释将jdbi查询的结果映射到我感兴趣的bean,如下所示: 如果应用程序中使用的实例尚未注册到任何自定义映射器中,则此操作很好。 此映射器在应用程序开始时注册到实例,如下所示: 重写方法,并提供逻辑将任何类型的结果从数据库转换为相关的bean类型。正是这个uber转换器负责整个应用程序中所有DB到POJO的转换。 我的问题是:有没有一种方法可以告诉继续使用这个将结果从数据库转换为所有类

  • 我如何在一个代码块中实现我的所有需求?提前谢了。