0

我有一个如下所示的 csv 文件:

tau,rh,temp,
00,100,23,
03,85,25,
06,98,26,
09,100,15,

现在我知道如何从 csv 文件中绘制图形。我有下面的脚本:

import matplotlib.pyplot as plt
import numpy as np
import csv
import sys

file=sys.argv[1]
fname = open(file,'rt')
plt.plotfile(fname, ('tau', 'rh', 'tmp'), subplots=False)
plt.show()

这似乎工作正常。但是,我希望能够将 tmp 绘制在一组单独的 y 轴上,而不是 rh。我知道何时在多个轴上绘制多个图,您必须执行以下操作:

t = np.arange(1, 25.0, 5)
s1 = [1,2,3,4,5]
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label, ticks and tick labels match the line color.
ax1.set_ylabel('rh', color='b')
ax1.tick_params('y', colors='b')

ax2 = ax1.twinx()
s2 = [1,2,4,9]
ax2.plot(t, s2, 'r.')
ax2.set_ylabel('tmp', color='r')
ax2.tick_params('y', colors='r')

你得到两个地块。我想要做的是在上面的示例中基于读取 csv 文件将 s1 设置为 rh 的 csv 值,并将 s2 设置为 tmp 的 csv 值。我该怎么做呢?

4

2 回答 2

0

您的代码有几个问题。

我会使用 pandas 来阅读 csv 只是为了良好的做法。但它也应该这样工作。

绘图部分缺少“fig, ax1 = plt.subplots()”命令,第二部分对 x 和 y 有不同的长度数组(t 是 5 个术语,s2 是 4 个术语)

尝试这个:

fig, ax1 = plt.subplots()
t = np.arange(1, 25.0, 5)
s1 = [1,2,3,4,5]
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label, ticks and tick labels match the line color.
ax1.set_ylabel('rh', color='b')
ax1.tick_params('y', colors='b')

ax2 = ax1.twinx()
s2 = [1,2,4,9,10]
ax2.plot(t, s2, 'r.')
ax2.set_ylabel('tmp', color='r')
ax2.tick_params('y', colors='r')

希望能帮助到你!

于 2017-01-23T21:08:01.407 回答
0

您可以先将数据加载到数组中:

data = np.loadtxt(sys.argv[1], delimiter=',', skiprows=1, usecols=(0,1,2))
t = data[:,0]
s1 = data[:,1]
s2 = data[:,2]

然后继续绘制它。这假设您知道数据的列索引,而不仅仅是列名。不过最好使用熊猫:

import pandas
d = pandas.read_csv(sys.argv[1])

然后在您设置的轴上 plot(d['tau'], d['rh']) 和 plot(d['tau'], d['temp']) 代替第二个中的 s1 和 s2你的代码的一部分。

于 2017-01-23T21:15:05.557 回答