使用Excel表格中的数据在Python中生成图形

4

我有很多数据存储在Excel电子表格中,现在需要通过Python进行图形化展示。我知道如何使用xlrd从Excel文件中读取数据,并且也知道如何使用matplotlib在Python中绘制图形。我的数据包含了x坐标、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 = np.array([]) 对于每个点,我都使用不同的误差值。由于我的正误差在电子表格的不同列中,我不知道如何导入数据。如果有人知道如何导入数据,请帮助我,因为这会让我的生活变得更轻松,我不必手动输入50个数据点。 谢谢!

编辑: 我的数据示例:

log(O/H)+12 正误差 负误差 银河系非静止坐标 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

谢谢!


一个示例展示您的Excel文件(或其虚拟版本)将会很好,这样我们就可以看到日期是如何组织的。 - Marcin
1个回答

5

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

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

我还稍微修改了数据的加载方式,让每列都被加载到自己的数组中,例如:

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

使用errorbar时,您可以通过传递以下形式的数组来为一个值产生正负误差:

yerr = [y_error_negative, y_error_positive]

y_error_negativey_error_positive是与y长度相同的数组。

接下来应该有以下内容:

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()

这给出了这个: enter image description here 如果没有更多细节,回答会更加困难。
编辑:
如果数据中有'-',则有很多忽略它的方法。因此,使用我以上概述的方式进行快速处理,您可以重新检查x值:
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

您需要将“-”替换为0,例如:
x = [float(i) if i != '-' else 0 for i in x]

另一种方法是在加载值时循环遍历这些值,并执行value if value.isdigit() else 0,而不需要两个列表推导式。或者,您可以像您所说的那样完全忽略它:
x = [float(i) for i in x if i!= '-']

如果你能拥有对维尔戈星系群落入距离的普遍上限,那么最好不要浪费你的金属量数据。如果你不断收到TypeError错误,请提供更多信息。


你好,谢谢,这真的很有帮助。我的数据基本上看起来像你说的那样,只是有时会有间隙。 - Rima
x y pos yerr neg yerr 1 2 3 4 3 2 - 5 0 9 4 6我认为这可能是导致我一直收到错误的原因。TypeError:不支持减法运算符类型的操作数:“unicode”和“unicode”。 - Rima
更新了答案,如果你仍然有问题,你需要提供更多的东西,比如回溯信息。 - jonnybazookatone
你好,感谢回复。由于我一直收到这个错误,所以我提供了上面的回溯信息。 - Rima
看起来它没有将加载的值转换为浮点数。有趣的是我没有遇到任何问题。尝试编辑后的版本(即,尝试将值强制转换为浮点数)。这就是为什么你会得到回溯,因为u'1' - u'1'对于字符串/Unicode没有任何作用。 - jonnybazookatone
我可能理解有误,但我认为你在放置 ncols 的地方应该放置 nrows - irowe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接