-2

好的,所以我在 Python 中有这个代码,我从 csv 文件导入问题是该 csv 文件中有不是基本数字的列。有一列是格式为“INT, EXT”的文本,有一列是从“0:00 到 11:59”格式的点钟格式。我有第三列作为“00.00”格式的正常数字距离。

我的问题是如何绘制距离与 o'clock 的关系,然后根据一个是 INT 还是 EXT 来改变散点图的点颜色。

我的第一个问题是如何让程序读取时钟格式。和来自 csv 的文本格式。

有什么想法或建议吗?提前致谢

这是我尝试导入的 CSV 示例

ML  INT  .10  534.15  0:00
ML  EXT  .25  654.23  3:00
ML  INT  .35  743.12  6:30

我想将第 4 列绘制为 x 轴,将第 5 列绘制为 y 轴

这是我到目前为止的代码示例

import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np

style.use('ggplot')

a,b,c,d = np.loadtxt('numbers.csv',
                unpack = True,
                delimiter = ',')



plt.scatter(a,b)




plt.title('Charts')
plt.ylabel('Y Axis')
plt.xlabel('X Axis')

plt.show()
4

2 回答 2

1

使用 pandas 从您的示例 csv 中读取:

import pandas as pd
import matplotlib.pyplot as plt
import datetime

data = pd.read_csv('data.csv', sep='\t', header=None)
print data

印刷:

    0    1     2       3     4
0  ML  INT  0.10  534.15  0:00
1  ML  EXT  0.25  654.23  3:00
2  ML  INT  0.35  743.12  6:30

然后将“INT”与“EXT”分开:

ints = data[data[1]=='INT']
exts = data[data[1]=='EXT']

将它们更改为 datetime 并获取距离:

int_times = [datetime.datetime.time(datetime.datetime.strptime(t, '%H:%M')) for t in ints[4]]
ext_times = [datetime.datetime.time(datetime.datetime.strptime(t, '%H:%M')) for t in exts[4]]
int_dist = [d for d in ints[3]]
ext_dist = [d for d in exts[3]]

然后为“INT”和“EXT”分别绘制一个散点图:

fig, ax = plt.subplots()
ax.scatter(int_dist, int_times, c='orange', s=150)
ax.scatter(ext_dist, ext_times, c='black', s=150)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.show()

在此处输入图像描述

编辑:添加代码以回答评论中有关如何将时间更改为 12 小时格式(范围从 0:00 到 11:59)并去除秒数的问题。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

data = pd.read_csv('data.csv', header=None)
ints = data[data[1]=='INT']
exts = data[data[1]=='EXT']
INT_index = data[data[1]=='INT'].index
EXT_index = data[data[1]=='EXT'].index
time = [t for t in data[4]]
int_dist = [d for d in ints[3]]
ext_dist = [d for d in exts[3]]

fig, ax = plt.subplots()
ax.scatter(int_dist, INT_index, c='orange', s=150)
ax.scatter(ext_dist, EXT_index, c='black', s=150)
ax.set_yticks(np.arange(len(data[4])))
ax.set_yticklabels(time)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.ylabel('Time')
plt.show()

在此处输入图像描述

于 2015-05-05T06:25:15.733 回答
0

我已经对此提出了另一个答案,但会保留原件,因为我相信它仍然很好,只是没有完全回答你的特定问题。

我还生成了更多的数据行,以使问题(至少在我这边)更有意义。

为我解决这个问题的是生成第 5 列(在代码中,而不是 csv),它是对应于特定点钟时间的分钟数,即 11:59 映射到 719 分钟。使用 pandas,我将这个新列插入到数据框中。然后,我可以每隔 60 分钟为每个小时(“0:00”、“1:00”等)放置字符串刻度标签。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

data = pd.read_csv('Workbook2.csv', header=None)
print data

打印我的伪造数据:

    0    1     2       3      4
0  ML  INT  0.10  534.15   0:00
1  ML  EXT  0.25  654.23   3:00
2  ML  INT  0.30  743.12   6:30
3  ML  EXT  0.35  744.20   4:30
4  ML  INT  0.45  811.47   7:00
5  ML  EXT  0.55  777.90   5:45
6  ML  INT  0.66  854.70   7:54
7  ML  EXT  0.74  798.40   6:55
8  ML  INT  0.87  947.30  11:59 

现在创建一个函数将 o'clock 转换为分钟:

def convert_to_min(o_clock):
    h, m = o_clock.split(':')
    return int(h) * 60 + int(m)
# using this function create a list times in minutes for each time in col 4
min_col = [convert_to_min(t) for t in data[4]]
data[5] = min_col  # inserts this list as a new column '5'
print data 

我们的新数据:

    0    1     2       3      4    5
0  ML  INT  0.10  534.15   0:00    0
1  ML  EXT  0.25  654.23   3:00  180
2  ML  INT  0.30  743.12   6:30  390
3  ML  EXT  0.35  744.20   4:30  270
4  ML  INT  0.45  811.47   7:00  420
5  ML  EXT  0.55  777.90   5:45  345
6  ML  INT  0.66  854.70   7:54  474
7  ML  EXT  0.74  798.40   6:55  415
8  ML  INT  0.87  947.30  11:59  719

现在构建 x 和 y 轴数据、刻度标签和刻度位置:

INTs = data[data[1]=='INT']
EXTs = data[data[1]=='EXT']

int_dist = INTs[3]  # x-axis data for INT
ext_dist = EXTs[3]

# plotting time as minutes in range [0 720]
int_time = INTs[5]  # y-axis data for INT
ext_time = EXTs[5]

time = ['0:00', '1:00', '2:00', '3:00', '4:00', '5:00', 
        '6:00', '7:00', '8:00', '9:00', '10:00', '11:00', '12:00']
# this will place the strings above at every 60 min
tick_location = [t*60 for t in range(13)]

现在绘制:

fig, ax = plt.subplots()
ax.scatter(int_dist, int_time, c='orange', s=150)
ax.scatter(ext_dist, ext_time, c='black', s=150)
ax.set_yticks(tick_location)
ax.set_yticklabels(time)
plt.legend(['INT', 'EXT'], loc=4)
plt.xlabel('Distance')
plt.ylabel('Time')
plt.title('Seems to work...')
plt.show()

在此处输入图像描述

于 2015-05-14T05:19:53.353 回答