# 乱数シード
# 乱数が実行のたびに変化させない命令文。
# 別の乱数にしたい場合は引数の値を変える。
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
\(x\)の値は共通で\(y\)の値だけ異なる場合のグラフ作成方法。
matplot関数を使って複数の時系列データをまとめて表示させる。
type = “l”は,プロットの種類(type)で線(line)を示す。
matplot(x = px, y = d, type = "l")
type = “o”は,プロットの種類で線と点を示す。
pch(point character)を使うと1文字記号のマーカーを指定できる。
記号番号で指定しても良い。例)pch = 16(小さな黒丸)
matplot(x = px, y = d, type = "o", pch = colnames(d))
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)
# 図枠
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))
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
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
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()