如何绘制一个事件相对于其他事件的频率?

时间:2016-07-02 18:35:41

标签: python excel pandas matplotlib

我想将python / matplotlib / pandas用于我的目的。

问题描述:我有一张excel表(我可以读作庞巴数据帧),其中包含一个真实值和估计值的表。我想以某种方式在实际(水平轴)与估计值(垂直轴)的图上捕获此信息。 excel表看起来有点如下:

enter image description here

我正在考虑散点图。但我不知道如何获得这样的情节。在这种情况下,它不是简单的散点图。此外,轴需要以不同方式处理。如果有其他适当的方式,请随时提出建议。

修改1:

根据@BrenBarn的建议,我在Cross Validated发布了我的查询。我特别喜欢的一个答案显示了以下可视化: (see link)

我想使用python生成类似的散点图。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

为了使该表成为类似于您链接的图表,我首先要创建一个数组,其中一个轴对应于"实际值"和另一个估计值" (因此包括上表中没有的所有零值):

import matplotlib.pyplot as plt
import numpy as np
label = ['A', 'F', 'J', 'P', 'T', 'Z']
nlabel = 6
values = np.zeros([nlabel, nlabel])
values[0, 0] = 10; values[0, 2] = 10; values[0, 3] = 10
values[1, 1] = 40; values[2, 1] = 10; values[3, 3] = 10
values[3, 4] = 10; values[4, 5] = 30; values[4, 3] = 20
values[5, 4] = 10
print "  ", label
for i in np.arange(nlabel): print label[i], values[i]

打印以确保它看起来像上面的表格:

   ['A', 'F', 'J', 'P', 'T', 'Z']
A [ 10.   0.  10.  10.   0.   0.]
F [  0.  40.   0.   0.   0.   0.]
J [  0.  10.   0.   0.   0.   0.]
P [  0.   0.   0.  10.  10.   0.]
T [  0.   0.   0.  20.   0.  30.]
Z [  0.   0.   0.   0.  10.   0.]

然后我会使用这些值来缩放matplotlib.pyplot.scatter中标记的大小,如下所示。

fig, ax = plt.subplots()
for i in np.arange(nlabel):
  plt.scatter(np.arange(nlabel), i * np.ones_like(values[i]), 
              s=values[i] * 42, marker='s')

plt.axes([0, nlabel+1, 0, nlabel+1])
ticklabel = [item.get_text() for item in ax.get_xticklabels()]
ticklabel[1:1+nlabel] = label
ax.set_xticklabels(ticklabel)
ax.set_yticklabels(ticklabel)
ax.set_xlabel('Estimated')
ax.set_ylabel('Actual')
plt.show()

这应该会给你一个与你所链接的情节非常类似的情节。我没有做趋势线或方块内的数字,但Google / StackOverflow应该能够为您提供解决方案。