如何使用matplotlib将数组中的数字绘制为注释?

时间:2016-04-15 19:08:49

标签: python arrays numpy matplotlib

我正在尝试使用从气象数据中提取的数据在底图上生成地图。示例代码为: -

y=[2.56422, 3.77284,3.52623,3.51468,3.02199]
z=[0.15, 0.3, 0.45, 0.6, 0.75]
n=[58,651,393,203,123]

fig, ax = plt.subplots()
ax.scatter(z, y)

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i],y[i]))

enter image description here

我使用的数据是一个numpy数组。我不知道如何遍历每个数组来绘制类似于上面的地图类型。我想只绘制值(即没有countourcontourf)。

最初我试图使用pylab.plot函数绘制浮点值。但是,它错误地退回了

ValueError: third arg must be a format string

然后我尝试将这个numpy数组转换为字符串,然后用这个命令绘图: -

temperature = np.array2string(data, precision=2)

并且print语句看起来像一个修改过的字符串: -

print temperature
[[ 19.69  21.09  21.57  21.45  20.59  20.53  20.93  20.63  20.64  21.26
   21.29  20.63  20.98  21.01  20.84  20.81  20.55  20.33  20.52  20.23
   19.84]
 [ 20.77  21.35  20.81  20.64  20.9   20.78  20.79  23.57  20.11  21.07
   21.06  21.33  21.48  21.18  21.4   21.09  20.5   20.31  20.12  19.8
   19.97]
 [ 21.51  21.23  20.55  20.08  20.05  20.78  21.17  24.77  21.17  20.95
   21.43  21.47  21.46  21.77  21.69  21.13  20.47  20.04  20.08  20.37
   20.14]
 [ 21.29  21.1   20.63  20.32  20.22  20.37  24.4   23.82  22.23  21.03
   22.11  22.62  22.71  22.37  21.73  21.35  21.03  20.67  20.58  20.89
   20.93]
 [ 21.24  21.04  20.68  20.56  20.76  20.91  24.26  23.75  23.28  21.26
   21.48  22.    21.94  21.78  21.36  21.14  20.96  20.92  21.1   21.19
   21.31]
 [ 20.83  20.88  20.6   20.87  21.01  21.91  22.33  22.21  21.74  20.66
   20.76  20.73  21.04  21.09  20.83  20.7   20.72  20.71  21.23  21.04
   20.73]
 [ 20.32  20.41  20.19  20.05  20.68  22.17  21.82  20.67  19.85  19.02
   18.91  19.6   20.15  20.64  20.64  20.09  19.81  19.76  19.9   19.94
   19.46]
 [ 19.68  20.37  20.56  20.68  20.93  21.28  21.24  20.33  20.7   20.
   18.72  18.94  19.56  19.57  19.83  19.74  19.17  18.53  18.1   18.72
   19.12]
 [ 18.88  19.71  20.77  20.81  20.32  21.58  20.96  21.33  21.2   20.17
   19.95  22.05  19.72  19.85  19.3   18.75  18.69  18.44  17.57  17.2
   18.22]
 [ 19.11  19.19  20.13  20.78  21.25  21.98  21.15  20.96  20.66  20.14
   20.51  21.92  20.36  20.27  19.    18.22  17.81  17.58  17.16  16.67
   17.46]
 [ 18.5   19.28  19.57  20.01  21.16  21.01  21.06  20.93  20.62  19.89
   20.3   20.7   19.7   19.76  18.24  17.    16.36  16.63  17.62  17.32
   17.38]
 [ 17.6   18.33  20.27  19.97  20.63  20.51  21.09  21.39  20.81  19.55
   20.    18.3   17.32  18.24  17.57  17.15  16.42  15.76  16.14  16.45
   21.95]
 [ 17.04  17.55  18.16  18.32  21.23  20.5   20.41  19.82  20.7   20.55
   20.41  18.47  18.05  17.63  17.11  15.6   16.02  15.46  14.29  13.88
   23.04]]

最后,当我尝试使用此行

在地图上绘制上述值时,我收到此错误
pylab.plot(x, y, temperature)

    'Unrecognized character %c in format string' % c)
ValueError: Unrecognized character [ in format string

问题似乎是nparray到字符串转换。

感谢您解决此问题的任何帮助。

1 个答案:

答案 0 :(得分:1)

使用ax.annotate的原始解决方案对于更通用的解决方案来说非常好。唯一要改变的是,在2d数组的情况下,你需要在使用np.ravel()(它也是ndarray类的类方法)循环它们之前展平它们。

但是,在您的具体情况下,您可以通过ravel() broadcast显示您需要绘制的三个数组,明确索引使用import numpy as np import matplotlib.pyplot as plt # generate some dummy data z,y = np.meshgrid(range(3),range(3)) n = np.random.random_integers(low=50,high=500,size=z.shape) fig, ax = plt.subplots() ax.scatter(z, y) for zz,yy,txt in np.broadcast(z,y,n): ax.annotate(txt, (zz,yy))

np.broadcast

请注意,zip(z.ravel(),y.ravel(),n.ravel())的结果与我们使用np.broadcast的结果相同,@Singleton public class SomeImplementation implements IImplementMe { private final String value; @Inject public SomeImplementation(final SomeOtherConfig configuration) { this.value= configuration.getValue(); } @Override public String getValue() { return value; } } 创建类似生成器的对象的巨大差异,因此它不会创造必要的巨大阵列(这是完美的)。