Python, Matplotlib: Как установить диапазон оси, когда x - время? - PullRequest
0 голосов
/ 19 января 2020

Я делаю школьный проект Arduino дома, и учитель просит меня визуализировать мои данные для него. На моей оси X у меня есть более 20K временных точек, которые нужно показать, и я пытаюсь установить диапазон для этого.

График, который я пытаюсь достичь: desired graph

То, что я получил до сих пор: current graph

Совершенно ясно, что я делаю что-то не так, и я искал способ решить это.

# часть моей части построения это то, что я узнал из inte rnet, но они здесь не работают.

Пожалуйста, помогите мне, и если что-то неясно, дайте мне знать!

import csv
import matplotlib.pyplot as plt
from datetime import datetime

header = []
data = []

path="DATALOG.csv"   #CHANGE filename to match file
file = open(path, newline='')
reader=csv.reader(file)

header=next(reader) #This reads the first row and stores the words in header.
data=[row for row in reader]  #This reads the rest and store the data in a list

file.close()  #closes the file when complete

# This function will print the headings with their index. Helpful when dealing with many columns
def print_header():
   for index, column_header in enumerate(header):
       print(index, column_header)

# I want the high and low temperatures in New Glasgow for June 2010
# Key headings
# 0 date/time
# 1 temperature
# 2 humidity %
# 3 light level%

days = []
light = []

for row in range (len(data)):
    day = data[row][0]
    lights = data[row][3]
    current_date=datetime.strptime(data[row][0], "%A %H:%M:%S %d/%m/%Y")

    light.append(float(lights))        #store the day’s high temp in list
          #store the day’s low temp in list
    days.append(str(day))

fig = plt.figure(dpi=128, figsize = (50, 6))

#x = [dc[0] for dc in days]

#xticks = range(0,len(x),10)
#xlabels=[x[index] for index in xticks]
#xticks.append(len(x))
#xlabels.append(days[-1][0])
#ax.set_xticks(xtick)
#ax.set_xticklabels(xlabels,rotation=40)

plt.plot(days,light,c = 'red',label = 'temprature')

plt.title("LIGHT")
plt.xlabel('days',fontsize = 5)
#ax.plot(np.arange('Wednesday 12:00:00 08/01/2020',' Thursday 11:58:10 09/01/2020'), range(10))
fig.autofmt_xdate()
plt.ylabel('light (%)', fontsize = 12)
plt.tick_params(axis='both', which='major', labelsize = 10)

plt.legend()
plt.show()
plt.savefig('plot.png')

1 Ответ

0 голосов
/ 19 января 2020

Вот пример того, как вы можете построить свои данные, используя r:

Поскольку вы не предоставили воспроизводимый пример, я создал поддельный пример, используя мое понимание вашего кода. По сути, похоже, что у вас есть файл с 4 столбцами: Days, Temperature, Humidity и Light_levels. Здесь я создаю только две колонки.

set.seed(123)
df <- data.frame(Day = as.character(seq.Date(from = as.Date("2019-01-01", format = "%Y-%m-%d"), to =as.Date("2019-02-01", format = "%Y-%m-%d"), by = "days" )),
                 Light_levels = sample(0:100,32, replace = TRUE))

Файл данных df должен выглядеть следующим образом:

> head(df)
         Day Light_levels
1 2019-01-01           30
2 2019-01-02           78
3 2019-01-03           50
4 2019-01-04           13
5 2019-01-05           66
6 2019-01-06           41

Я думаю, что ваша проблема связана с управлением форматом даты. В r довольно часто, когда вы импортируете CSV-файл как фрейм данных, он преобразует даты в факторный или символьный формат.

Вы можете проверить, просмотрев структуру фрейма данных с помощью str функция:

> str(df)
'data.frame':   32 obs. of  2 variables:
 $ Day         : Factor w/ 32 levels "2019-01-01","2019-01-02",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Light_levels: int  30 78 50 13 66 41 49 42 100 13 ...

Итак, чтобы использовать даты в формате даты, вам необходимо преобразовать этот фактор-формат в формат даты, используя:

df$Day = as.Date(df$Day, format = "%Y-%m-%d")

Теперь, если вы проверите структура df, вы увидите:

str(df)
'data.frame':   32 obs. of  2 variables:
 $ Day         : Date, format: "2019-01-01" "2019-01-02" "2019-01-03" ...
 $ Light_levels: int  30 78 50 13 66 41 49 42 100 13 ...

Теперь вы можете построить ее с пакетом ggplot2 (сначала у вас есть тонна установки ggplot2):

library(ggplot2)
ggplot(df, aes(x = Day, y = Light_levels))+
  geom_line()+
  scale_x_date(date_breaks = "days", date_labels = "%b %d")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

и получите следующий график: enter image description here

Вы можете настроить отображение каждой даты, играя с аргументами scale_x_date (см. Дополнительную информацию здесь: https://ggplot2.tidyverse.org/reference/scale_date.html)

В качестве альтернативы, без установки пакета ggplot2, вы можете сделать это, используя функцию base R plot:

plot(x = df$Day, y = df$Light_levels, type = "l", xaxt = "n", xlab = "")
axis.Date(1,at=seq(min(df$Day), max(df$Day), by="days"), format="%b %d")

enter image description here

Надеюсь, это поможет вам понять, как построить ваши данные.

...