matplotlib 如何使用fill_between和colormap来填充2D图的背景?

ddarikpa  于 2023-05-18  发布在  其他
关注(0)|答案(2)|浏览(161)

我试图从一个3列数据集中制作一个简单的二维图。y=f(x)和z=f(x)。我想绘制xy并想使用颜色显示z。例如,[x1,x2,min(y),max(y)]…将由取决于z值的背景色填充。我尝试使用fill_between,但无法将颜色Map与它关联起来。我是matplotlib和python的新手。我将非常感谢您的意见/建议。
编辑:我没有一个准确的图表,但我将尝试解释我的查询与下图sample plot的帮助
例如在x=0.5至x=1,z=1,x=1.0,至x=1.5,z=2......之间。
所以我想用对应于z=1的颜色覆盖x=0.5到x=1(min(y)到max(y)],以及在x=1、x=1.5、z=2之间等等。我想用颜色Map来显示这个变化,并在右边显示这个颜色条。

c90pui9n

c90pui9n1#

下面是解决方案,那些想要使用contourf或出于其他原因需要fill_between的人(就像在这种情况下,不规则的网格数据)。

import numpy as np
import matplotlib.pyplot as plt
from random import randint, sample
import matplotlib.colorbar as cbar

# from Numeric import asarray
%matplotlib inline

# The edges of 2d grid
# Some x column has varying rows of y (but always the same number of rows) 
# z array that corresponds a value in each xy cell

xedges = np.sort(sample(range(1, 9), 6))
yedges = np.array([np.sort(sample(range(1, 9), 6)) for i in range(5)])
z = np.random.random((5,5))

f, ax = plt.subplots(1, sharex=True, figsize=(8,8))
f.subplots_adjust(hspace=0)
ax.set_ylabel(r'y')
ax.set_xlabel(r'x')
ax.set_ylim(0,10)
ax.set_xlim(0,10)

c = ['r','g','b','y','m']

normal = plt.Normalize(z.min(), z.max())
cmap = plt.cm.jet(normal(z))

# plot showing bins, coloured arbitrarily.
# I want each cell coloured according to z.
for i in range(len(xedges)-1):
    for j in range(len(yedges)):
        ax.vlines(xedges[i],yedges[i][j],yedges[i][j+1],linestyle='-')
        ax.hlines(yedges[i][j],xedges[i],xedges[i+1],linestyle='-')
        ax.vlines(xedges[i+1],yedges[i][j],yedges[i][j+1],linestyle='-')
        ax.hlines(yedges[i][j+1],xedges[i],xedges[i+1],linestyle='-')

        ax.fill_between([xedges[i],xedges[i+1]],yedges[i][j],yedges[i][j+1],facecolor=cmap[i][j][:])

cax, _ = cbar.make_axes(ax) 
cb2 = cbar.ColorbarBase(cax, cmap=plt.cm.jet,norm=normal)

这给

xqkwcwgp

xqkwcwgp2#

我觉得你应该用contourf
http://matplotlib.org/examples/pylab_examples/contourf_demo.html
这将以x作为某个因变量,产生y = y(x)z = z(x)。看起来你的z并不依赖于y,但是contourf仍然可以处理这个问题。
举个简单的例子:

import pylab as plt
x = plt.linspace(0,2,100)
y = plt.linspace(0,10,100)

z = [[plt.sinc(i) for i in x] for j in y]

CS = plt.contourf(x, y, z, 20, # \[-1, -0.1, 0, 0.1\],
                        cmap=plt.cm.rainbow)
plt.colorbar(CS)
plt.plot(x,2+plt.sin(y), "--k")

有许多变化,但希望这捕获的元素,你正在寻找

相关问题