【问题标题】:Pyplot - fill_between gradientPyplot - fill_between 渐变
【发布时间】:2021-09-01 06:43:16
【问题描述】:

我正在尝试使用fill_between 填充图表下方的区域。我可以让它使用单一颜色(比如红色),但我无法使用颜色图在图表下获得渐变。从fill_betweendocumentation 我知道我应该能够使用颜色图用渐变填充该区域,但我无法使其工作。颜色图已正确加载,因为我可以从加载的颜色图中访问单独的颜色并用所述颜色填充该区域。

最小的工作示例:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

colourmap = mpl.cm.get_cmap('jet')
singlecolor = mpl.cm.get_cmap('jet')(500)

xx = np.arange(0,10,0.1)
yy = xx*np.exp(-xx)

plt.figure()
plt.plot(xx,yy)
plt.fill_between(xx,yy,cmap=colourmap,alpha=0.3)
# plt.fill_between(xx,yy,color=singlecolor,alpha=0.3)
plt.show()

我没有收到任何错误消息,并且我使用的是 Python 3.8。如何使用颜色图进行填充?

【问题讨论】:

  • This answer 已经过时了,所以可能有更简单的解决方法。这是一种堆叠渐变方块的方法。

标签: python matplotlib colormap


【解决方案1】:

您可以使用以下代码填充小梯形 100 倍,以便用整个颜色图调色板填充曲线下方的区域。

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

colourmap = mpl.cm.get_cmap('jet')

xx = np.arange(0,10,0.1)
yy = xx*np.exp(-xx)

plt.plot(xx,yy)
normalize = mpl.colors.Normalize(vmin=yy.min(), vmax=yy.max())
npts = 100
for i in range(npts - 1):
    plt.fill_between([xx[i], xx[i+1]],
                     [yy[i], yy[i+1]],
                     color=colourmap(normalize(yy[i]))
                     ,alpha=0.6)
plt.show()

这将产生以下图表:

【讨论】:

    【解决方案2】:

    您可以提取填充的多边形,然后将其用作图像的剪辑多边形。由于imshow() 设置了严格的 x 和 y 限制,您可以重新应用限制。水平渐变使用np.linspace(0, 1, 256).reshape(-1, 1),垂直渐变使用...resphape(1,-1)

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = np.linspace(0, 10, 200)
    y1 = np.sin(x)
    y2 = x * (10 - x) / 25
    
    polygon = plt.fill_between(x, y1, y2, lw=0, color='none')
    xlim = plt.xlim()
    ylim = plt.ylim()
    verts = np.vstack([p.vertices for p in polygon.get_paths()])
    gradient = plt.imshow(np.linspace(0, 1, 256).reshape(1, -1), cmap='turbo', aspect='auto',
                          extent=[verts[:, 0].min(), verts[:, 0].max(), verts[:, 1].min(), verts[:, 1].max()])
    gradient.set_clip_path(polygon.get_paths()[0], transform=plt.gca().transData)
    plt.xlim(xlim)
    plt.ylim(ylim)
    plt.show()
    

    【讨论】:

    • 如果此答案或其他答案解决了您的问题,您可能会考虑对有用的答案进行投票,并将marking 的答案视为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2018-09-14
    相关资源
    最近更新 更多