1 データ

# 乱数シード
# 乱数が実行のたびに変化させない命令文。
# 別の乱数にしたい場合は引数の値を変える。
set.seed(2)

# rnorm関数を使用して3種類の正規乱数を生成する。
u <- rnorm(n = 10, mean =  0, sd = 1) # サイズ10, 平均 0,標準偏差1
v <- rnorm(n = 10, mean =  2, sd = 2) # サイズ10, 平均 2,標準偏差2
w <- rnorm(n = 10, mean = -2, sd = 3) # サイズ10, 平均-2,標準偏差3

# カラムu,v,wを持つデータフレームを作成し,
# round関数を使い小数第2位までの値に丸める。
d <- round(data.frame(u, v, w), 2)

# 時刻オブジェクトの作成
# 時刻はISO形式(yyyy-mm-dd HH:MM:SS)で与える。
fr <- as.POSIXct("2022-08-11 12:00:00") # 開始時刻
to <- as.POSIXct("2022-08-20 12:00:00") # 終了時刻

# 数列作成関数seqを使用して開始~終了まで1日おきの時刻オブジェクトを作成
px <- seq(fr, to, by = "days")

# rownames関数を使いレコード名(行名)を時刻ラベルにする。
rownames(d) <- px

nr <- nrow(d) # レコード数(行数)
nc <- ncol(d) # カラム数(列数)

# Pythonのグラフ作成用にデータフレームをCSV形式で保存する。
# quote = Fを付けると文字列データをリテラル「"」で囲まない(quote:引用)
write.csv(d, file = "timeseries_py.csv", quote = F)

# 作成したデータフレームを表として表示する。
library(DT)
datatable(d, caption = "正規乱数の時系列データ")
# カラーパレット
# R(red),G(green),B(blue)の三原色と透過率を指定して色を表現する。
COL <- c(rgb(255,   0,   0,  255, max = 255), # 赤
         rgb(  0,   0, 255,  255, max = 255), # 青
         rgb(  0, 155,   0,  255, max = 255)) # 緑

[RGB_Color] https://www.rapidtables.com/web/color/RGB_Color.html


2 時系列グラフ(簡易)

\(x\)の値は共通で\(y\)の値だけ異なる場合のグラフ作成方法。

2.1 線のみ

matplot関数を使って複数の時系列データをまとめて表示させる。
type = “l”は,プロットの種類(type)で線(line)を示す。

matplot(x = px, y = d, type = "l")

2.2 線+マーカー

type = “o”は,プロットの種類で線と点を示す。
pch(point character)を使うと1文字記号のマーカーを指定できる。
記号番号で指定しても良い。例)pch = 16(小さな黒丸)

matplot(x = px, y = d, type = "o", pch = colnames(d))

2.3 線+マーカー+格子線+軸ラベル+凡例

lty: line type(線種) col: color(色)

# 作図
matplot(x = px, y = d, type = "o", pch = 1:nc, xlab = "2021", ylab = "値")

# 格子線
#(線が目盛りからずれときがあるため,後述のabline関数を利用を推奨)
grid()

# 凡例(はんれい)
# 表示場所はtop(上)/bottom(下)とright(右)/left(左)を組み合わせて決める。
# 例)topleft(左上)
legend("bottomright", legend = colnames(d), pch = 1:nc, lty = 1:nc, col = 1:nc)

3 時系列グラフ(出版品質)

# 図枠 
matplot(x = px,            # POSIXct形式の時刻オブジェクト(x軸)
        y = d,             # データフレーム(y軸;u, v, wの時系列データ)
        type = "n",        # 線種(type):プロットしない("n")
        xaxt = "n",        # x軸テキスト(xaxt):表示しない("n")
        ylim = c(-12, 12), # y軸の範囲
        main = "主タイトル",
        xlab = "x軸 ラベル [単位]",
        ylab = "y軸 ラベル [単位]")

# x軸目盛り用時刻オブジェクト
# 時間間隔は秒単位で設定する。'month'なども設定できる。
# 数列作成関数seqを使い,px[1]からpx[nr]を超えない範囲で2日(60*60*24*2秒)
# おきに時刻オブジェクトの数列を作成
px.g <- seq(px[1], px[nr], by = 60*60*24*2)

# x軸(side = 1)のatの位置にlabelsで示すラベルを貼付
# format関数は時刻オブジェクトを指定した形式に加工する。
# [format関数の記号]
# %Y:年,%m:月(先導0有),%b:月(先導0無),%d:日,%a:曜日
# %H:時(先導0有),%k:時(先導0無),%M:分,%s:秒
axis(side = 1, at = px.g, labels = format(px.g, "%b/%d(%a)"))

# 格子線
abline(lty = 2,               # 線種(2:点線) 
       col = gray(0.5, 0.25), # 灰色(濃さ,透過率)
       h   = seq(-50, 50, 5), # 水平線; horizontal lines
       v   = px.g)            # 垂直線; vertical lines

# 作図
# $x$値をそれぞれ独立に設定する場合でもOK
matlines(x = px, y = d$u, type = "o", pch = 1, lty = 1, col = COL[1])
matlines(x = px, y = d$v, type = "o", pch = 2, lty = 2, col = COL[2])
matlines(x = px, y = d$w, type = "o", pch = 3, lty = 3, col = COL[3])

# 凡例
legend("topright", col = COL, pch = 1:nc, lty = 1:nc, legend = colnames(d))

4 インタラクティブグラフ

library(plotly)

# フォント設定
kyokasho <- list(size = 11, color = "blue", family = "UD Digi Kyokasho NK-R")

plot_ly(mode = "lines+markers") |>
  add_trace(x = px, y = d$u, name = "u") |>
  add_trace(x = px, y = d$v, name = "v") |>
  add_trace(x = px, y = d$w, name = "w") |>
  config(locale = "ja") |> # x軸ラベルの月を日本語表示
  layout(font = kyokasho,
         title = "主タイトル",
         xaxis = list(title = "x軸ラベル[単位]"),
         yaxis = list(title = "y軸ラベル[単位]"))

[plotly::time-series] https://plotly.com/r/time-series

5 Python

5.1 データ

import pandas as pd

# CSVデータの読み込み
d = pd.read_csv('timeseries_py.csv')
d = d.rename(columns = {'Unnamed: 0': 'px'}) # カラム名を変更

# 時刻ラベル(str型)を時刻型(datetime型)に変換しインデックスに変換
d['px'] = pd.to_datetime(d['px'])
d = d.set_index('px')
print(d)
##                         u     v     w
## px                                   
## 2022-08-11 12:00:00 -0.90  2.84  4.27
## 2022-08-12 12:00:00  0.18  3.96 -5.60
## 2022-08-13 12:00:00  1.59  1.21  2.77
## 2022-08-14 12:00:00 -1.13 -0.08  3.86
## 2022-08-15 12:00:00 -0.08  5.56 -1.99
## 2022-08-16 12:00:00  0.13 -2.62 -9.36
## 2022-08-17 12:00:00  0.71  3.76 -0.57
## 2022-08-18 12:00:00 -0.24  2.07 -3.79
## 2022-08-19 12:00:00  1.98  4.03  0.38
## 2022-08-20 12:00:00 -0.14  2.86 -1.13

5.2 作図

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# x軸ticks表示形式
plt.gca().xaxis.set_major_formatter(
  mdates.DateFormatter("%b/%d (%a)"))
  
# x軸ticks表示間隔
plt.gca().xaxis.set_major_locator(
  mdates.DayLocator(interval = 2))
  
# x軸ticksフォントサイズ
plt.xticks(fontsize = 10)
## (array([1.]), [Text(1.0, 0, '1/02 (金)')])
# ラベル
plt.title('主タイトル')
plt.xlabel('x軸ラベル[単位]')
plt.ylabel('y軸ラベル[単位]')

# 格子線(grid lines)
plt.grid(linestyle = '--', color = (0.9, 0.9, 0.9, 0.25))

# プロット
plt.plot(d['u'], label = 'u', marker = 'o', linestyle = 'solid')
plt.plot(d['v'], label = 'v', marker = '^', linestyle = 'dotted')
plt.plot(d['w'], label = 'w', marker = '*', linestyle = 'dashed')

# 凡例
plt.legend(loc = 'lower right')

# 図表示
plt.show()