plotly で複数のサブプロットを取ってグラフを追加する

plotlyの勉強中。メソッドがやたらあって検索すると色々なやり方がヒットして戸惑う……。

plotly で3行・3列のサブプロットを取って、1行1列目、2行2列目、3行3列目に折れ線グラフを追加したい。以下の3つはすべて同じ結果。

from plotly.subplots import make_subplots

fig = make_subplots(rows=3, cols=3)

#「折れ線グラフを追加する」メソッド。どのサブプロットに追加するかをrow,colで指定する。
#何も考えずに追加するならこれが一番簡単。
fig.add_scatter(y=[1,3,1], row=1, col=1)
fig.add_scatter(y=[2,2,2], row=2, col=2)
fig.add_scatter(y=[3,1,3], row=3, col=3)
fig.show()
from plotly.subplots import make_subplots

fig = make_subplots(rows=3, cols=3)

#「グラフ」を追加するメソッドに、折れ線グラフを渡す。
fig.add_trace(go.Scatter(y=[1,3,1]), row=1, col=1)
fig.add_trace(go.Scatter(y=[2,2,2]), row=2, col=2)
fig.add_trace(go.Scatter(y=[3,1,3]), row=3, col=3)
fig.show()
from plotly.subplots import make_subplots

fig = make_subplots(rows=3, cols=3)

#複数グラフの追加に対応したメソッド。
#追加するグラフをリストで渡し、どのサブプロットに追加するかをrows,colsで指定する。
#グラフのリスト順とrows, colsのリスト順が対応するように注意すること。
fig.add_traces([
    go.Scatter(y=[1,3,1]),
    go.Scatter(y=[1,1,1]),
    go.Scatter(y=[3,1,3])
],rows=[1,2,3], cols=[1,2,3])
fig.show()

f:id:kobak:20220312224216p:plain

print_grid() を使うことでサブプロットのグリッドを確認できる。

fig.print_grid()

This is the format of your plot grid:
[ (1,1) x,y ] [ (1,2) x2,y2 ] [ (1,3) x3,y3 ]
[ (2,1) x4,y4 ] [ (2,2) x5,y5 ] [ (2,3) x6,y6 ]
[ (3,1) x7,y7 ] [ (3,2) x8,y8 ] [ (3,3) x9,y9 ]

ONU内蔵ひかり電話ルーターにtransix対応ルーターを接続していた場合の自宅NASへの接続設定

やりたい事:インターネットから自宅NAS(Synology DS220j) のWebDAVIPv6で接続したい

構成:ONU内蔵ひかり電話ルーター - trasix対応ルーター(aterm) - NAS(Synology DS220j)

正解:trasix対応ルーター(aterm)とONU内蔵ひかり電話ルーターの両方で、IPv6パケットフィルタ設定(NASアドレスwebDAVポートへの透過)を行う

先週末からどうやっても繋がらなくて困っていたが、ONU内蔵ひかり電話ルーター - trasix対応ルーター(aterm) という構成だったため、ひかり電話ルーターでも透過のIPv6パケットフィルタ設定が必要だったという話です。ずっとaterm側の IPv6パケットフィルタをいじり続けて ping から何から何も通らないと悩み続けていたのですが、ひかり電話ルーターIPv6ファイアウォール機能で全部破棄されていたという。

Dietz #76 Original Oil Burning Lantern

f:id:kobak:20201106183051j:plain

Dietz(デイツ)のオイルランタン。ハリケーンランタンと言われる類のものらしい。米AMAZONで購入。なぜか国内の通販サイトだとオイルランタンが品薄&価格高騰している……。本体価格$29.99、送料$17.64、しめて$47.63。支払いは5124円でした。送料はかかったけど国内通販で買うよりは安い。10/18に注文して到着は11/4だったかな。配達は日本郵便でした。

明るさの方はまあそれなり。実用性というよりは雰囲気ですね。燃料はパラフィンオイルを使ってみたけど、室内だとロウソクと同じ様な臭いはしますね。外だと殆ど気にならないかな。

プリムス 2245ランタン

 自宅の玄関でオブジェと化していたプリムスの2245ランタン。20年以上前のモデル。現行品は点火装置が付いてるけどコイツには付いていない。ソロキャンプを始めようと道具集めをしていたところ、玄関に転がってる物体がランタンであることを最近になって認識したのだった(特に意識せず毎日見てると気が付かない)。

 OD缶に付けっぱなしだったが中のパッキンも傷んでないし、バルブを開ければガスも出るみたいだし、じゃあ、ということでマントルを注文し使えるか試してみることに。マントルは純正ではなく大王マントルのDT-140を注文。ちょっと触っても崩れないらしい。

f:id:kobak:20201104151549j:plain

 上の画像はマントルの空焼き直後。サイズ的には丁度いい。本当はガソリンランタン用のマントルみたいだが、マントルってガス用とガソリン用で違いはあるんだろうか。しかしなんで純正マントル注文しなかったんだ?

f:id:kobak:20201104152007j:plain

 点火。記憶だともうちょっと明るかったような……。どうもマントルの被り方が悪いのか部分的にしか発光していない気がする。もう少し上だったかな。

SIGMA 18-200mm F3.5-6.3 DC MACRO OS HSM / Contemporary 買った

連休で暇だったので発作的にニコンFマウント用のSIGMA 18-200mm F3.5-6.3 DC MACRO OS HSM|Contemporary を購入。放ったらかしていた Nikon D5300 に装着して試し撮りをしてみた。

f:id:kobak:20190505124228j:plain

18mm, 1/500, F8, ISO100

f:id:kobak:20190505124306j:plain

200mm, 1/500, F8, ISO100

f:id:kobak:20190505125830j:plain

18mm, 1/400, F10, ISO100

f:id:kobak:20190505133355j:plain

200mm, 1/640, F6.3, ISO100

f:id:kobak:20190505131314j:plain

65mm, 1/320, F5.3, ISO100

 

f:id:kobak:20190505131031j:plain

18mm, 1/320, F9, ISO100

 

f:id:kobak:20190505131201j:plain

34mm, 1/200, F7.1, ISO100

f:id:kobak:20190505132422j:plain

24mm, 1/250, F8, ISO100

f:id:kobak:20190505125103j:plain

200mm, 1/1000, F6.3, ISO100

キットレンズの AF-S DX NIKKOR 18-55mm f/3.5-5.6G VR II の写りが優秀だったので、それと比べてしまうとだいぶ甘いけどまあいいんじゃなかろうか。問題点らしきものと言えば、最後の1枚はわざと目立たせてあるが絞り開放だと周辺減光はそれなりにあるのと、広角側の歪み方が複雑でちょっと汚いことくらいか。

ここ最近はずっとマイクロフォーサーズのGX7MK2ばかり使ってたけど、荷物に余裕がある時はD5300を持ち出すことにしよう。

(ホワイトバランスがおかしいことに今更気づいたけどこのまま)

 

matplotlib の 棒グラフ でx軸に日付をとりたいんだけど

matplotlib の pyplot.bar で棒グラフを描く際、x軸に日付の入った pandas の Series をそのまま渡して問題なく動いていたのだけれど、 ある日から突然動作しなくなった。多分 conda update anaconda かけたタイミングだと思うのだが、バージョンとか無頓着で全然わからん。

values使ったら動くようになったからいいけど……。なんで?

import pandas as pd
import matplotlib.pyplot as plt
#エクセルを読み込む。日単位のデータをグラフにしたい。
df = pd.read_excel("test.xlsx")
df
seq accessdate a b
0 1 2018-06-01 430 68
1 2 2018-06-02 285 80
2 3 2018-06-03 125 89
3 4 2018-06-04 487 57
4 5 2018-06-05 477 1
5 6 2018-06-06 159 4
6 7 2018-06-07 332 98
7 8 2018-06-08 224 18
8 9 2018-06-09 106 3
#各列の型はこんな感じ
df.dtypes
seq                    int64
accessdate    datetime64[ns]
a                      int64
b                      int64
dtype: object
#x軸にseqを与える。動く。
plt.bar(df.seq,df.a)
<BarContainer object of 9 artists>
#x軸にaccessdateを与える。動かない。以前は動いていた。
#型のことで怒られていそうなのはわかるが、何か仕様がかわったのか。
plt.bar(df.accessdate,df.a)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-25-78e092c13e1a> in <module>()
----> 1 plt.bar(df.accessdate,df.a)


~\Anaconda3\lib\site-packages\matplotlib\pyplot.py in bar(*args, **kwargs)
   2768                       mplDeprecation)
   2769     try:
-> 2770         ret = ax.bar(*args, **kwargs)
   2771     finally:
   2772         ax._hold = washold


~\Anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, *args, **kwargs)
   1853                         "the Matplotlib list!)" % (label_namer, func.__name__),
   1854                         RuntimeWarning, stacklevel=2)
-> 1855             return func(ax, *args, **kwargs)
   1856 
   1857         inner.__doc__ = _add_data_doc(inner.__doc__,


~\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py in bar(self, *args, **kwargs)
   2257         if align == 'center':
   2258             if orientation == 'vertical':
-> 2259                 left = x - width / 2
   2260                 bottom = y
   2261             elif orientation == 'horizontal':


TypeError: ufunc subtract cannot use operands with types dtype('<M8[ns]') and dtype('float64')
#x軸にaccessdate.valuesを与える。動く。
plt.bar(df.accessdate.values,df.a)
<BarContainer object of 9 artists>
#こっちはpandasのSeriesだけど、
type(df.accessdate)
pandas.core.series.Series
#valuesだと numpy.ndarray
type(df.accessdate.values)
numpy.ndarray
#lineだとそのまんまで動くんだよなー
plt.plot(df.accessdate, df.a)
[<matplotlib.lines.Line2D at 0x145329175c0>]

f:id:kobak:20180715093505p:plain

Windows10に無償アップグレードしたプリインストール版Windowsのハードウェア変更と再認証

 表題の件。検索するとライセンス再認証に成功した・しなかったと色々な話が見つかるが、基本的にはハードウェア変更前にWindowsのアカウントをMicrosoftアカウントに切り替えてライセンスの紐付けを行い、ハードウェア変更後に引き続きMicrosoftアカウントでWindowsにサインインしてライセンス再認証を行えば良いという話であった。

 今回、Windows 10 Pro に無償アップグレード済みであった、HP製HPE-190jp(Windows 7 Ultimate プリインストール)のマザーボードとCPUを交換し、ライセンス認証に成功したので備忘録として記事を残す。

 さて、今回ハードウェアを交換したHPE-190jpは Intel Core i7 - 960 を選択し、CPUの世代としては 初代 Core i シリーズである Nehalem であり、「Sandy Bridgeおじさん」の一つ前にあたる。とはいえ性能自体は Core i7 2600K と 大差はなく、すでにHHDはSSDに換装していたこともあり、ネット巡回にNetflixやPrime Videoあたりの動画を観るといった使い方ではそれほど不満も覚えなかったが、TDP130Wという値からもわかる発熱の多さとその熱を冷却するためのファンの轟音にいい加減耐えられなくなった。

 そして今回、新しく選んだCPUは AMD Ryzen 2700X 。注文する直前まで Core i7-8700Kで行くつもりだったが、発作的に Ryzen を選択することとなった。ベンチマークの比較記事や脆弱性の件で思うところがあったのもあるが、特にOCもやるつもりもないので、値段も大して変わらずにRyzenはリテールクーラーが付いているから楽でいいやと考えたのもある。普通、自作する人間からすればリテールクーラーなどゴミでしかないだろうが、自作から暫く離れていた自分のような人間にとっては手っ取り早く動かせるので有り難いのである。

 CPU 交換に付随して当然マザーボードやメモリも交換。MBはMSI X470 GAMING PLUS を。メモリはDDR4-2666 8GB*2 とした。ケースと電源も買い替え。グラボ(GTX1060 6GB)、光学ドライブ、そしてWindows 10 proが納められたSSDはHPE-190jpから移植した。果たしてライセンス認証は上手く行くのか? 

 HPE-190jpのバラシを含めて、電源の投入までは3時間強を費やした。久々だったのでだいぶ戸惑った。絶対どこかミスってるよな、さあ、まずBIOS画面を拝めるかどうか、ダメだろうなと、脳内でブツブツ呟いていると無事にBIOS画面が。簡単に設定をすませてWindowsのブートへ。そして特段、躓くこともなくログイン画面が表示。すごい。Windows10 しゅごい。その昔、MB交換で散々苦労していたのは何だったのか。

 さっそくライセンス認証の状態を確認すると、ライセンス認証されていない状態になっていたため、ネットで調べた手順を実行。「トラブルシューティング」⇛「このデバイス上のハードウェアを最近変更しました」を選択すると、新しいウィンドウが表示され……あれ白いままだ……何か嫌な予感が。

 

Windowsを再度ライセンス認証することができません

現在、弊社のサーバが利用できないためです。数分間待機するか、Microsoftアカウントをもう一度追加してみてください。

  

 この後、数回トラブルシューティングを繰り返すも同様。再起動しても同様。3時間待っても同様。これもしかするとエラーメッセージと実際の原因が一致していない奴では?さすがにここまでハードウェアが別物になっているとプリインストール版は認証を許さないのか?くそ折角Windows褒めたに全然しゅごくない。畜生。さすがMSKK。糞が。

 そして翌日。M.2 SSDDSP版のWindowsでも購入するかと通販サイトを物色。ほぼ諦めて最後にダメ元でライセンス認証をやり直してみると……。ライセンス認証が通った。

f:id:kobak:20180429151827p:plain

 メッセージの通りサーバ側の問題だったのだろうか。 検索してみると、一度サインインをローカルアカウント管理に切り替え、もう一度Microsoftアカウントに戻すと認証が通るとの情報もありよくわからない。うーん。やはり、この手のシステムメッセージは額面通りに受け取れないところがある。何にせよ認証が通ってよかった。

 安心して色々設定を見直していると、すでに別のPCに変わり果てたWindowsのバージョン情報にはサポートとして製造元情報にHPが記載されたままになっているのを見つけた。

f:id:kobak:20180429151725j:plain