所以我目前在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: 我仍然有一个错误,所以这里是追溯。
谢谢!
答案 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
给出了这个:
如果没有更多详细信息,回答起来会有点困难。
编辑:
如果数据中有“ - ”,则有很多方法可以忽略它。因此,快速破解我上面概述的方式,您可以重新检查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,请提供更多信息。