Matplotlib:在同一轴上有两个不同左右刻度的图

时间:2016-02-23 02:07:48

标签: python matplotlib

我正在尝试使用此示例: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命令,但显然没有。我怎么能这样做?

1 个答案:

答案 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 - zip(*)的做法也适用于嵌套的iterables 。但是,您应首先使用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()

enter image description here