使用excel表中的数据在python

时间:2015-07-08 23:51:42

标签: python excel matplotlib graph xlrd

所以我目前在excel电子表格中有很多数据。我需要通过python绘制图形。我知道如何使用xlrd从excel文件中读取数据,我知道如何使用matplotlib在python中绘图。基本上我的数据看起来有x坐标,y坐标以及正y和负y错误的列。我需要一种方法来从电子表格导入数据,并成为图表上的点和误差线。说实话,我在python上很新,不知道为什么我的代码不起作用。

import xlrd
import numpy as np
import matplotlib.pyplot as plt
file_location = "C:/Users/Rima/Desktop/apjl731data.xlsx"
workbook = xlrd.open_workbook(file_location)
first_sheet = workbook.sheet_by_index(0)
for col in range(first_sheet.ncols):
    x = first_sheet.cell_value(0,col)
    y = first_sheet.cell_value(1,col)
    yerr = first_sheet.cell_value(2,col)
plt.errorbar(x,y,yerr,fmt='r^')
plt.show()

我还没有找到如何在线进行此操作,只是如何使用python在Excel中制作图表。我确定我的代码在工作时可能会遗漏很多,但我不确定是什么。同样对于yerr,为了在数据点的顶部和底部获得不同的错误值,我已将其作为数组传递      yerr = np.array([]) 每个点的错误值不同。我不知道如何导入数据,因为我的肯定错误和负面错误在电子表格的不同列中。如果有人知道如何导入数据,请帮助,因为它会让我的生活更轻松,因为我不需要输入50型数据点。 谢谢!

编辑: 我的数据的一个例子是

log(O/H)+12 positive error negative error virgo infall distance 8.56 0.05 0.05 4.61 8.59 0.03 0.03 - 8.54 0.04 0.06 2.97297 8.94 0.13 0.12 8.24493

我的数据中确实存在间隙 - 标记为 - ,我不知道在尝试绘图时是否会导致错误。所以我可能需要一种方法来跳过这些线。 再次感谢。

编辑2: 我仍然有一个错误,所以这里是追溯。 enter image description here

谢谢!

1 个答案:

答案 0 :(得分:3)

我做了一些假设。假设您的数据是这样的:

var BrowserWindow: GithubElectron.BrowserWindow = require('browser-window');
var app = GitHubElectron.App = require('app');
app.on("ready", function() {
  var mainWindow = new BrowserWindow({
    width: 600,
    height: 800
  });
});

我还修改了稍微加载数据的方式,以便将每个列加载到自己的数组中,例如:

x y yerr_positive yerr_negative
1 1 0.1 0.2
2 2 0.1 0.2
3 3 0.1 0.2
4 4 0.1 0.2

通过传递表单数组,您可以使用errorbar为一个值产生正+负错误:

x = [first_sheet.cell_value(i, 0) for i in range(first_sheet.ncols)]

其中yerr = [y_error_negative, y_error_positive] y_error_negative是与y_error_positive长度相同的数组。

然后你应该有以下内容:

y

给出了这个: enter image description here

如果没有更多详细信息,回答起来会有点困难。

编辑:

如果数据中有“ - ”,则有很多方法可以忽略它。因此,快速破解我上面概述的方式,您可以重新检查x值:

import xlrd
import numpy as np
import matplotlib.pyplot as plt
file_location = "C:/Users/Rima/Desktop/apjl731data.xlsx"
workbook = xlrd.open_workbook(file_location)
first_sheet = workbook.sheet_by_index(0)

x = [first_sheet.cell_value(i, 0) for i in range(first_sheet.ncols)]
y = [first_sheet.cell_value(i, 1) for i in range(first_sheet.ncols)]
yerr_pos = [first_sheet.cell_value(i, 2) for i in range(first_sheet.ncols)]
yerr_neg = [first_sheet.cell_value(i, 3) for i in range(first_sheet.ncols)]

yerr = [yerr_neg, yerr_pos]

plt.errorbar(x,y,yerr,fmt='r^')

plt.axis([0,5,0,5])
plt.show()

然后删除' - '并替换为0,例如

x y yerr_positive yerr_negative
1 1 0.1 0.2
- 2 0.1 0.2
3 3 0.1 0.2
4 4 0.1 0.2

另一种方法是在加载时循环遍历值,并执行x = [float(i) if i != '-' else 0 for i in x] ,而不需要两个列表推导。

或者,你可以像你说的那样完全忽略它:

value if value.isdigit() else 0

如果你可以对处女座的游标距离有一些通用的上限,那么浪费你的金属度数据会更好。如果你继续获得TypeErrors,请提供更多信息。