【问题标题】:matplotlib.patches.Polygon colors not renderingmatplotlib.patches.Polygon 颜色不渲染
【发布时间】:2018-04-24 03:41:34
【问题描述】:
for info, shape in zip(map.counties_info, map.counties):
    if info['FIPS'] in geoids:
        x = np.random.rand(1)[0]
        c = cmap(x)[:3]
        newc = rgb2hex(c)
        patches.append(Polygon(np.array(shape), color=newc, closed=True))

ax.add_collection(PatchCollection(patches))

plt.title('Counties with HQ of NYSE-Listed Firms: 1970')
plt.show()

生成此图像:

我的问题是代码专门要求多边形中的随机颜色。如果我打印 newc 的值并将它们显示在将十六进制代码转换为颜色的网站上,则有多种不同的颜色。但是输出只有一个。我该如何解决这个问题?

【问题讨论】:

    标签: python-2.7 matplotlib colors polygon patch


    【解决方案1】:

    为了使PatchCollection 的各个补丁具有不同的颜色,您有两种选择。

    1. 使用原始补丁的颜色。​​
    2. 使用颜色图根据某些值数组确定颜色。

    使用原始补丁的颜色。​​

    这种方法最接近问题中的代码。它需要将参数match_original=True 设置为补丁集合。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.colors
    import matplotlib.patches
    import matplotlib.collections
    
    ar = np.array([[0,0],[1,0],[1,1],[0,1],[0,0]])
    cmap=plt.cm.jet
    patches=[]
    
    fig, ax=plt.subplots()
    
    for i in range(5):
        x = np.random.rand(1)[0]
        c = cmap(x)[:3]
        poly = plt.Polygon(ar+i, color=c, closed=True)
        patches.append(poly)
    
    collection = matplotlib.collections.PatchCollection(patches,match_original=True)
    ax.add_collection(collection)
    
    ax.autoscale()
    plt.show()
    

    使用颜色图根据一些值数组确定颜色。

    这可能更容易实现。您可以为PatchCollection 设置一个值数组,并指定一个颜色图,根据该颜色图对多边形进行着色,而不是为每个单独的多边形指定颜色。

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.colors
    import matplotlib.patches
    import matplotlib.collections
    
    ar = np.array([[0,0],[1,0],[1,1],[0,1],[0,0]])
    values = np.random.rand(5)
    cmap=plt.cm.jet
    patches=[]
    
    fig, ax=plt.subplots()
    
    for i in range(len(values)):
        poly = plt.Polygon(ar+i, closed=True)
        patches.append(poly)
    
    collection = matplotlib.collections.PatchCollection(patches, cmap=cmap)
    collection.set_array(values)
    ax.add_collection(collection)
    ax.autoscale()
    
    plt.show()
    

    【讨论】:

    • 看来我没有可信度来支持您的回复。但它有效(对于可能在这里绊倒并想知道建议的代码是否有效的其他人)。谢谢。
    • 收到回复时,您可以采取两种行动:(1) 赞成 (2) 接受。您可以只接受一个答案(如果有多个,请选择最适合您需要的一个);您可以投票赞成任何您认为有用的答案。投票已登记,即使由于声誉点低而未显示。见someone answers
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    相关资源
    最近更新 更多