我正在尝试使用此示例:http://matplotlib.org/examples/api/two_scales.html#api-two-scales 使用我自己的数据集,如下所示:
import sys
import numpy as np
import matplotlib.pyplot as plt
print sys.argv
logfile = sys.argv[1]
data = []
other_data =[]
with open(logfile,'rb') as f:
for line in f:
a = line.split(',')
print a
data.append(a[1])
other_data.append(a[2][:-1])
print other_data
x = np.arange(0,len(data))
fig,ax1 = plt.subplots()
ax1.plot(x,np.arange(data))
ax2 = ax1.twinx()
ax2.plot(x,np.arange(other_data))
plt.show()
但是,我一直收到这个错误:
'Traceback (most recent call last):
File "share/chart.py", line 17, in <module>
ax1.plot(x,np.arange(data))
TypeError: unsupported operand type(s) for -: 'list' and 'int'
我认为我正确使用了twinx命令,但显然没有。我怎么能这样做?
答案 0 :(得分:2)
试
x1.plot(x,np.array(data)) # do you mean "array" here?
在两个地方,而不是
x1.plot(x,np.arange(data))
但你为什么要在这里使用任何东西呢?如果你只是
x1.plot(data)
它将自动生成您的x值,matplotlib
将处理各种不同的迭代,而无需转换它们。
您应该通过添加一些示例数据来提供其他人可以立即运行的示例。这也可以帮助你调试。它被称为Minimal, Complete, and Verifiable Example。
你也可以摆脱一些脚本:
import matplotlib.pyplot as plt
things = ['2,3', '4,7', '4,1', '5,5']
da, oda = [], []
for thing in things:
a, b = thing.split(',')
da.append(a)
oda.append(b)
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(da)
ax2.plot(oda)
plt.savefig("da oda") # save to a .png so you can paste somewhere
plt.show()
注意1: matplotlib
正在为您生成x轴的值作为默认值。如果你愿意,你可以把它们放进去,但这只是一个犯错误的机会。
注2: matplotlib
正在接受字符串,并会尝试为您转换为数字值。
如果你想拥抱python,请使用列表推导,然后使用zip(*)
- 这是zip()
的反转:
import matplotlib.pyplot as plt
things = ['2,3', '4,7', '4,1', '5,5']
da, oda = zip(*[thing.split(',') for thing in things])
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(da)
ax2.plot(oda)
plt.savefig("da oda") # save to a .png so you can paste somewhere
plt.show()
但如果真的非常希望使用数组,那么转置 - array.T
- 做的做法也适用于嵌套的iterables 。但是,您应首先使用zip(*)
做int()
或float()
:
import matplotlib.pyplot as plt
import numpy as np
things = ['2,3', '4,7', '4,1', '5,5']
strtup = [thing.split(',') for thing in things]
inttup = [(int(a), int(b)) for a, b in strtup]
da, oda = np.array(inttup).T
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax1.plot(da)
ax2.plot(oda)
plt.savefig("da oda")
plt.show()