Matplotlib:如何根据数字绘制彩色网格框

1 投票
2 回答
1576 浏览
提问于 2025-04-28 00:27

我有一个文件,里面有以下数据

0018.00 -083.00 45
0018.00 -082.00 55
0018.00 -081.00 15
0019.00 -100.00 25
0019.00 -099.00 45
0019.00 -098.00 05
0019.00 -086.00 25
0019.00 -085.00 25
0019.00 -084.00 35
0019.00 -083.00 45

第一列是y值。
第二列是x值。
第三列是z值。
我想给每个z值分配一种颜色,并把这个数据集绘制成网格框。

比如说,

05=Brown
15=Red
25=Green
35=Blue
45=Purple
55=Orange

它看起来会像下面的图片 ![在这里输入图片描述][1]

我试着查看mathplotlib的缩略图,但它们似乎只适用于随机数据集。

我应该用什么代码来绘制我的列数据呢?

到目前为止,我尝试了以下代码

import numpy
import matplotlib.pyplot as plt

cm = plt.cm.get_cmap('RdYlBu')

var = numpy.loadtxt('map.csv')

y = var[:, 0:1]
x = var[:, 1:2]
colors = var[:, 2:3]

plt.scatter(x, y, colors, cmap=cm)
plt.show()
暂无标签

2 个回答

1

你用的这个scatter方法虽然能用,但要调整一下才能让效果看起来不错。这里有个简单的例子:

import numpy as np
import matplotlib.pyplot as plt

# unpack columns from map.csv into x y and z variables.
y, x, z = np.loadtxt('map.csv').T

ax = plt.subplot(111, aspect='equal')
ax.scatter(x, y, c=z, marker='s', s=160, lw=0, cmap='RdYlBu')
plt.show()

注意我调整了标记的形状(marker='s'表示方形)和大小(s=160),同时还指定了z值用来表示颜色(c=z)。

不过,正如你所发现的,scatter并不适合用来显示你想要的那种规则网格。你可以考虑使用imshow或者@heltonbiker推荐的某种pcolor变体,这样效果会更好。

1

你可以使用 imshow 这个函数。

import numpy
import matplotlib.pyplot as plt

content = numpy.loadtxt('map.csv', delimiter=',')

# here you would have to create a "grid"
# where each value in content would be "binned" to the correct position,
# creating the array named "bins"

plt.imshow(bins, 
           interpolation='nearest',
           cmap=plt.cm.RdYlBu,
           extent=[xmin, xmax, ymin, ymax])  ## you should be able to figure these out

撰写回答