Vẽ biểu đồ bằng mảng
Tôi có một tập hợp dữ liệu mà tôi muốn vẽ dưới dạng biểu đồ. Tôi có danh sách các dấu thời gian mà tôi muốn nhóm mỗi giờ và sau đó tôi muốn xem số điểm mỗi giờ trong biểu đồ đường (trong một ngày, nơi tôi có dữ liệu của nhiều ngày, mà tôi muốn có trong biểu đồ mỗi ngày ).
Tôi có giá trị của điểm mỗi giờ và tôi có giờ mà chúng xảy ra. Tôi không làm cho nó hoạt động khi nó cho một đường thẳng trong biểu đồ của tôi và tôi nghĩ rằng tôi đang thiếu một giải pháp đơn giản. Tôi cũng đã đăng một bức ảnh để bạn có thể xem kết quả. Bước sau để hiển thị dòng là gì?
Tôi có mã sau:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import csv
from datetime import timedelta
import datetime as dt
data= pd.read_csv('test2.csv', header=0, index_col=None, parse_dates=True, sep=';', usecols=[0,1])
df=pd.DataFrame(data, columns=['Date', 'Time'])
df['DateTime'] = df['Date'] + df['Time']
#for date in df['DateTime']:
def RemoveMilliSeconds(x):
return x[:-5]
df['Time'] = df['Time'].apply(RemoveMilliSeconds)
df['DateTime'] = df['Date'] + df['Time']
df['DateTime'] = pd.to_datetime(df['DateTime'], format="%Y:%m:%d %H:%M:%S")
df['TimeDelta'] = df.groupby('Date')['DateTime'].apply(lambda x: x.diff())
#print(df['TimeDelta'] / np.timedelta64(1, 'h'))
df['HourOfDay'] = df['DateTime'].dt.hour
df['Day'] = df['DateTime'].dt.day
grouped_df = df.groupby('Day')
for key, item in grouped_df:
print(grouped_df.get_group(key)['HourOfDay'].value_counts(), "\n\n")
res=[]
for i in df['DateTime'].dt.hour:
if i not in res:
res.append(i)
print("enkele lijst:" + str(res))
#range = (0,24)
#bins = 2
#plt.hist(df['DateTime'].dt.hour, bins, range)
x=np.array([res])
y=np.array([df['HourOfDay'].value_counts()])
plt.plot(x,y)
plt.show()
#times = pd.DatetimeIndex(df.Time)
#grouped = df.groupby([times.hour])
Hình ảnh hiển thị đầu ra
Dữ liệu mẫu của tôi:
Date;Time
2020:02:13 ;12:39:02:913
2020:02:13 ;12:39:42:915
2020:02:13 ;13:06:20:718
2020:02:13 ;13:18:25:988
2020:02:13 ;13:34:02:835
2020:02:13 ;13:46:35:793
2020:02:13 ;13:59:10:659
2020:02:13 ;14:14:33:571
2020:02:13 ;14:25:36:381
2020:02:13 ;14:35:38:342
2020:02:13 ;14:46:04:006
2020:02:13 ;14:56:57:346
2020:02:13 ;15:07:39:752
2020:02:13 ;15:19:44:868
2020:02:13 ;15:32:31:438
2020:02:13 ;15:44:44:928
2020:02:13 ;15:56:54:453
2020:02:13 ;16:08:21:023
2020:02:13 ;16:19:17:620
2020:02:13 ;16:29:56:944
2020:02:13 ;16:40:11:132
2020:02:13 ;16:49:12:113
2020:02:13 ;16:57:26:652
2020:02:13 ;16:57:26:652
2020:02:13 ;17:04:22:092
2020:02:17 ;08:58:08:562
2020:02:17 ;08:58:42:545
Trả lời
Bạn đã không chuẩn bị dữ liệu xy của mình theo cách matplotlibcó thể hiểu được mối quan hệ của chúng.
"Câu trả lời" dễ dàng sẽ là âm mưu resvà df['HourOfDay'].value_counts()trực tiếp chống lại nhau:
#.....
#range = (0,24)
#bins = 2
#plt.hist(df['DateTime'].dt.hour, bins, range)
plt.plot(res, df['HourOfDay'].value_counts())
plt.show()
Nhưng kết quả đầu ra mẫu cho bạn thấy vấn đề:
matplotlibkhông sắp xếp x-giá trị cho bạn (điều đó sẽ làm sai lệch dữ liệu trong ngữ cảnh khác). Vì vậy, chúng ta phải làm điều này trước khi vẽ:
#.....
#range = (0,24)
#bins = 2
#plt.hist(df['DateTime'].dt.hour, bins, range)
xy=np.stack((res, df['HourOfDay'].value_counts()))
xy = xy[:, np.argsort(xy[0,:])]
plt.plot(*xy)
plt.show()
Bây giờ, x-giá trị theo thứ tự chính xác và y-giá trị đã được sắp xếp với chúng trong xymảng kết hợp mà chúng tôi đã tạo cho mục đích này:
Rõ ràng, sẽ tốt hơn nếu chuẩn bị resvà df['HourOfDay'].value_counts()trực tiếp, vì vậy chúng ta không phải tạo một mảng kết hợp để sắp xếp chúng lại với nhau. Vì bạn không cung cấp lời giải thích mã của bạn phải làm gì, chúng tôi chỉ có thể khắc phục sự cố sau mã đã tạo - bạn nên cấu trúc nó theo cách khác để sự cố này không xảy ra ngay từ đầu. Nhưng chỉ bạn mới có thể làm điều này (hoặc những người hiểu ý định của mã của bạn - tôi thì không).
Tôi cũng khuyên bạn nên dành một chút thời gian với các hướng dẫn matplotlib hướng dẫn - thời gian này không bị lãng phí.
Cập nhật
Có vẻ như bạn cố gắng tạo một ô phụ cho mỗi ngày và đếm số mục nhập mỗi giờ. Tôi sẽ tiếp cận nó như thế này (nhưng tôi chắc chắn, một số chuyên gia về gấu trúc có những cách tốt hơn cho việc này):
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#read your data and create datetime index
df= pd.read_csv('test1.txt', sep=";")
df.index = pd.to_datetime(df["Date"]+df["Time"].str[:-5], format="%Y:%m:%d %H:%M:%S")
#group by date and hour, count entries
dfcounts = df.groupby([df.index.date, df.index.hour]).size().reset_index()
dfcounts.columns = ["Date", "Hour", "Count"]
maxcount = dfcounts.Count.max()
#group by date for plotting
dfplot = dfcounts.groupby(dfcounts.Date)
#plot each day into its own subplot
fig, axs = plt.subplots(dfplot.ngroups, figsize=(6,8))
for i, groupdate in enumerate(dfplot.groups):
ax=axs[i]
#the marker is not really necessary but has been added in case there is just one entry per day
ax.plot(dfplot.get_group(groupdate).Hour, dfplot.get_group(groupdate).Count, color="blue", marker="o")
ax.set_title(str(groupdate))
ax.set_xlim(0, 24)
ax.set_ylim(0, maxcount * 1.1)
ax.xaxis.set_ticks(np.arange(0, 25, 2))
plt.tight_layout()
plt.show()
Đầu ra mẫu:
Cập nhật 2
Để vẽ chúng thành các hình riêng lẻ, bạn có thể sửa đổi vòng lặp:
#...
dfplot = dfcounts.groupby(dfcounts.Date)
for groupdate in dfplot.groups:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
fig.suptitle("Date:"+str(groupdate), fontsize=16)
#scaled for comparability among graphs
ax1.plot(dfplot.get_group(groupdate).Hour, dfplot.get_group(groupdate).Count, color="blue", marker="o")
ax1.set_xlim(0, 24)
ax1.xaxis.set_ticks(np.arange(0, 25, 2))
ax1.set_ylim(0, maxcount * 1.1)
ax1.set_title("comparable version")
#scaled to maximize visibility per day
ax2.plot(dfplot.get_group(groupdate).Hour, dfplot.get_group(groupdate).Count, color="red", marker="x")
ax2.set_xlim(0, 24)
ax2.xaxis.set_ticks(np.arange(0, 25, 2))
ax2.set_title("expanded version")
plt.tight_layout()
#save optionally
#plt.savefig("MyDataForDay"+str(groupdate)+".eps")
print("All figures generated")
plt.show()
Đầu ra mẫu cho một trong những ngày:
được tạo bằng dữ liệu thử nghiệm sau:
Date;Time
2020:02:13 ;12:39:02:913
2020:02:13 ;12:39:42:915
2020:02:13 ;13:06:20:718
2020:02:13 ;13:18:25:988
2020:02:13 ;13:34:02:835
2020:02:13 ;13:46:35:793
2020:02:13 ;13:59:10:659
2020:02:13 ;14:14:33:571
2020:02:13 ;14:25:36:381
2020:02:13 ;14:35:38:342
2020:02:13 ;14:46:04:006
2020:02:13 ;14:56:57:346
2020:02:13 ;15:07:39:752
2020:02:13 ;15:19:44:868
2020:02:13 ;15:32:31:438
2020:02:13 ;15:44:44:928
2020:02:13 ;15:56:54:453
2020:02:13 ;16:08:21:023
2020:02:13 ;16:19:17:620
2020:02:13 ;16:29:56:944
2020:02:13 ;16:40:11:132
2020:02:13 ;16:49:12:113
2020:02:13 ;16:57:26:652
2020:02:13 ;16:57:26:652
2020:02:13 ;17:04:22:092
2020:02:17 ;08:58:08:562
2020:02:17 ;08:58:42:545
2020:02:17 ;15:19:44:868
2020:02:17 ;17:32:31:438
2020:02:17 ;17:44:44:928
2020:02:17 ;17:56:54:453
2020:02:17 ;18:08:21:023
2020:03:19 ;06:19:17:620
2020:03:19 ;06:29:56:944
2020:03:19 ;06:40:11:132
2020:03:19 ;14:49:12:113
2020:03:19 ;16:57:26:652
2020:03:19 ;16:57:26:652
2020:03:19 ;17:04:22:092
2020:03:19 ;18:58:08:562
2020:03:19 ;18:58:42:545