3

我正在尝试从 3 列数据集(例如 y=f(x) 和 z=f(x))制作一个简单的 2d 图。我想绘制 xy 并想使用颜色显示 z。例如,[x1,x2, min(y), max(y)] ... 之间的矩形区域将根据 z 的值填充背景颜色。我尝试使用 fill_between 但无法将颜色图与之关联。我是 matplotlib 和 python 的新手。非常感谢您的意见/建议。

编辑:我没有准确的情节,但我将尝试在下图 示例情节的帮助下解释我的查询

说在 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 等之间.. 我想使用颜色图显示这种变化,并在右侧显示这个颜色条。

4

2 回答 2

3

这是那些想要不能使用 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) 

这给

xy 网格,颜色为 z 的函数

于 2016-06-28T03:53:24.883 回答
1

在我看来你应该使用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")

有很多变化,但希望这能捕捉到您正在寻找的元素

在此处输入图像描述

于 2013-07-15T20:27:43.630 回答