【问题标题】:From 3D data to colormap [duplicate]从 3D 数据到颜色图
【发布时间】:2017-12-24 16:17:40
【问题描述】:

前言:我看过these,但我无法从答案中弄清楚如何制作情节。另外,我是 python 和 matplotlib 的新手。

我有一个表格的数据文件

X        Y       Z
0.05     1       z
0.10     1       z
...     ...     ...
0.95     1       z
0.05     2       z
...     ...     ...
...     ...     ...
0.95    10       z

其中每个的 z 在 [-0.02:0.5] 中。这些结果产生 190 个 (x,y,z) 点。

我是这样获取数据的

data_file = open('tau.txt', 'r')
buffer = data_file.read()
data_file.close()

data = [map(float, row.split('\t')) for row 
        buffer.strip().split("\n")]

正如链接所示,我将它们转换为网格

mu = []
alpha = [] 
tau = []

for elements in data:
    mu.append(elements[0])
    alpha.append(elements[1])
    tau.append(elements[2])

x_data = np.asarray(mu)
y_data = np.asarray(alpha)
z_data = np.asarray(tau)

xi = np.linspace(0.05,0.95,19)
yi = np.linspace(1,10,10)
ar = griddata(x_data,y_data,z_data,xi,yi,interp='nn')

然后我绘制图:我希望每个 (x,y) 坐标都有一个以坐标为中心的正方形,并带有一个显示 z 值的颜色条。

cmap = mpl.colors.LinearSegmentedColormap.from_list('my_colormap',
           ['white','grey','black'],256)

img = plt.imshow(ar,interpolation='nearest',cmap = 
           cmap,origin='lower')

plt.colorbar(img,cmap=cmap)

我得到这个:

首先,我希望颜色条与绘图本身具有相同的高度。我不明白如何避免这种垃圾。

此外,如果您查看文件,您会立即发现范围不正确:x 必须在 [0.05:0.95] 中,y 必须在 [1:10] 中。 y 只是简单地移动了 1(所有 z=0 的白线应该是 y=1 而不是 y=0),而 x 假定我无法理解的值。

重要的是要注意,除了这些之外,无论是 z 值还是趋势图都是正确的。

如何解决我的问题?

【问题讨论】:

  • @ImportanceOfBeingErnest 这个问题是重复的,你能把我链接到答案吗?
  • 在阅读了两个重复的问题之后,究竟有什么不清楚的地方?
  • 对不起,我先评论了。当您回答我的评论时,我看到了答案的链接。现在一切都很好!

标签: python matplotlib colormap


【解决方案1】:

imshow 更适合使用与矩阵或图像大小相同的网格来绘制图像和矩阵。这就是为什么你的 x 轴和 y 轴是这样的原因。

对于您要执行的操作,请使用 pcolormesh 或 pcolor 结合 numpy.meshgrid 获得正确的 x 和 y 间距。

这些函数还应该支持不规则的网格间距。

This page 有一些关于它如何工作的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    相关资源
    最近更新 更多