在matplotlib中绘制矩阵时,正负值索引数据返回错误的图轴或数据

2 投票
1 回答
1015 浏览
提问于 2025-04-18 13:49

我有一组变量,代表一些地理数据,还有一个变量是正值或负值。我在绘制散点图时,想把正值和负值用不同的颜色表示。但是在绘制正值时就遇到了问题:尽管这些值有最小值和最大值,但绘制出来的值似乎和比例不对应,感觉像是完全不同的值被绘制出来,或者值被用其他的坐标轴重新缩放了。x轴和y轴的缩放是一样的。我的系统是64位的Windows 8,使用的是32位的Python 2.7(和ArcGIS一起安装),numpy版本是1.8.1,matplotlib的版本不太确定。

我的代码大概是这样的:

>>> df.head()   ## DATA SAMPLE ##
       dem_sl  events  gwflabst  kipp_macht  luftb_hydgr_add
5056  4.01518       0  0.174846     3.56536         2.666560
5057  3.84420       0  0.000000     6.70155         2.193530
5058  3.95850       0  0.000000     7.18019         2.350860
5059  4.42980       0  0.661806     1.23403         3.514760
5496  1.25325       0  0.070530     9.10564        -0.821533

# df = ''pandas data frame, cleaned from NaN, lat lon dropped''
pos = np.where(df['events'] == 1)
neg = np.where(df['events'] == 0)
out = np.asmatrix(df)
# while looping through var:
for t in var:
  for tt in var:
    if t! = tt:

后来我在这里添加了打印两个变量最大值的代码。

[Dbg]>>> print '...Plotting '+t, ' with min-max: ', df[t].min(), '---', df[t].max()
...Plotting kipp_macht  with min-max:  0.0 --- 52.7769
[Dbg]>>> print '...Plotting '+tt, ' with min-max: ', df[tt].min(), '---', df[tt].max()
...Plotting luftb_hydgr_add  with min-max:  -2.70172 --- 34.7528

当我绘制第一个散点图时:

                                #col index of the var
  plt.scatter(out[np.array(neg), df.columns.get_loc(t)],out[np.array(neg), df.columns.get_loc(tt)], marker='x', c='r')
  plt.scatter(out[np.array(pos), df.columns.get_loc(t)],out[np.array(pos), df.columns.get_loc(tt)], marker='+', c='b')
  plt.show()

  del var[0] # del the first var

看起来我在两个轴上的数据都是根据整体的最大值和最小值来缩放的。即使我尝试用其他数据,且它们的比例差异更大,结果也是一样的。

有问题的图

最有趣的是,之前我只尝试绘制一次,没有使用循环,直接用简单的结构像out[0]来访问数据,这样我得到了我预期的结果。

我应该得到的结果

所以现在我不确定问题出在哪里,因为即使我只绘制负值或只绘制正值,它们的比例也已经很奇怪了。

我尝试创建图形并将其保存到文件中,也尝试用plt.clf()清理图形。通过访问相同的值,我还尝试绘制直方图来查看数据的分散情况,结果都很好,只有散点图有问题。

希望能得到一些帮助!

1 个回答

2

如果我理解得没错,你想要分别绘制kipp_machtluftb_hydgr_add,一个是当events == 0时,另一个是当events == 1时。

你可以直接利用events这一列的内容来创建布尔索引,然后用这些索引去获取kipp_machtluftb_hydgr_add的数据:

plt.scatter(df.kipp_macht[df.events == 1], df.luftb_hydgr_add[df.events == 1],
            'b+', label='pos')
plt.scatter(df.kipp_macht[df.events == 0], df.luftb_hydgr_add[df.events == 0],
            'rx', label='neg')

或者你也可以获取对应的行索引,然后用这些索引去访问kipp_machtluftb_hydgr_add,虽然这样做稍微复杂一些:

pos = np.where(df.events == 1)[0]
neg = np.where(df.events == 0)[0]
plt.scatter(df.kipp_macht[pos], df.luftb_hydgr_add[pos], 'b+', label='pos')
plt.scatter(df.kipp_macht[neg], df.luftb_hydgr_add[neg], 'rx', label='neg')

你还可以根据events这一列来过滤整个数据框:

df_pos = df[df.events == 1]
df_neg = df[df.events == 0]

这样的话,你就可以绘制任何一对参数之间的关系,分别针对“正面”和“负面”的情况,比如:

plt.scatter(df_pos.kipp_macht, df_pos.luftb_hydgr_add, 'b+', label='pos')
plt.scatter(df_neg.kipp_macht, df_neg.luftb_hydgr_add, 'rx', label='neg')

撰写回答