キュウリを植えたらキュウリと別の物ができると思うな。人は自分の植えたものを収穫するのである。
二宮尊徳(金次郎)
変わらなければ生き残れない
ドラスティックに何かを変えなければ...
そんな危機感が日々日々強くなっていきます。
ただやはりキュウリからはキュウリである。自分自身に今あるものを育てて、いかに美味しく生き生きとしたものにしていくか。こんな時だからこそしっかりと学び、またやってくる旬の時期に備えたいですね。
とキュウリキュウリ言っていますが、僕はキュウリが大好きです。浅漬け、ピリ辛、梅あえ、シンプルなもろきゅう&味噌マヨもたまりません。宮崎県のキュウリの冷汁も大好きです。
今回はキュウリでいきましょう!
キュウリの収穫量を可視化してみました。なんとPythonによるWebアプリで実現しています。
PythonでWebアプリ作成
Pythonといえば機械学習やディープラーニング用。そんな風に考えていらっしゃる方も多いかと思います。しかし、Pythonには様々なライブラリが存在しており、実はWebアプリも作成することが可能です。
では、コードを見ていきましょう。
1. ライブラリの定義
定義しているDashはPython用のWebアプリを作成するためのフレームワークです。Bootstrap(HTML, CSS, JavaScript フレームワーク)やPlotly(グラフライブラリ)を使うことができます。
import dash import dash_bootstrap_components as dbc import dash_html_components as html import dash_core_components as dcc import numpy as np import pandas as pd import plotly.graph_objects as pgo # Bootstrapスタイルシートをリンク app = dash.Dash(external_stylesheets=[dbc.themes.BOOTSTRAP])
2. データの取得
キュウリの収穫量データと都道府県の緯度経度データを読み込みます。
以下のサイトのデータを使用いたしました。
きゅうり(キュウリ・胡瓜)の産地|全国、都道府県別生産量(収穫量)の推移/グラフ/地図/一覧表|統計データ・ランキング|家勉キッズ
【みんなの知識 ちょっと便利帳】都道府県庁所在地 緯度経度データ - 各都市からの方位地図 - 10進数/60進数での座標・世界測地系(WGS84)
# きゅうりの都道府県別収穫量データ(CSVファイル)を読み込む # 引用: ieben.net | きゅうりの生産量(収穫量) # https://ieben.net/data/production-vegetables/japan-tdfk/k-kyuuri.html ccb = pd.read_csv('cucumber_jpn.csv') # 都道府県の緯度経度データ(Excelファイル)を読み込む # 引用: みんなの知識 ちょっと便利帳 | 都道府県庁所在地 緯度経度データ # https://www.benricho.org/chimei/latlng_data.html ccb_latlng = pd.read_excel("latlng_data.xls", header=4) ccb_latlng = ccb_latlng.drop(ccb_latlng.columns[[0,2,3,4,7]], axis=1).rename(columns={'Unnamed: 1': '都道府県'}) ccb_latlng = ccb_latlng.head(47)
3. データをグラフ表示用に加工
2で読み込んだデータを加工します。
# 収穫量分布バブルチャート用 # 「きゅうりの都道府県別収穫量データ」と「都道府県の緯度経度データ」をマージ ccb_merge = pd.merge(ccb, ccb_latlng, on='都道府県') # バブルチャートにカーソルをあてた時に表示されるテキストを定義 ccb_merge['notes'] = np.nan for i in range (len(ccb_merge)): ccb_merge['notes'][i] = ccb_merge['都道府県'][i] + ' / ' + str(ccb_merge['収穫量'][i]) + 't' + ' / ' + str(ccb_merge['順位'][i]) + '位' # 収穫量トップ20グラフ用 ccb_prep = ccb.sort_values("収穫量",ascending=False).head(20) ccb_prep = ccb_prep.sort_values("収穫量")
4. 画面表示処理
各エリアのサイズや色やテキストなどを仕様に従い定義します。とてもシンプルですね。
app.layout = dbc.Container( [ # 画面のタイトルエリア dbc.Row( [ dbc.Col( html.H1("キュウリの収穫量グラフ"), style = { "size": "30px", "backgroundcolor": "#fffcdb", "color": "#00a95f", "textAlign": "left", } ) ], ), # グラフのタイトルエリア dbc.Row( [ # 左グラフのタイトル dbc.Col( html.H4("収穫量分布"), width = 7, style = { "height": "100%", "backgroundcolor": "white", "textAlign": "left", "padding":"10px" }, ), # 右グラフのタイトル dbc.Col( html.H4("収穫量トップ20"), width = 5, style = { "height": "100%", "backgroundcolor": "white", "textAlign": "left", "padding":"10px" }, ), ], ), # グラフエリア dbc.Row( [ # 左グラフ dbc.Col( dcc.Graph( id = 'JpnMap', figure = { 'data' : [ pgo.Scattergeo( lat = ccb_merge["緯度"], lon = ccb_merge["経度"], marker = dict( color = 'rgb(0, 169, 95)', #バブルチャートの色 size = ccb_merge['収穫量']/1500+5, #バブルチャートのサイズ opacity = 0.7 #バブルチャートの透明度 ), hovertext = ccb_merge['notes'], #カーソルをあてた時に表示されるテキスト hoverinfo = "text" ) ], 'layout' : pgo.Layout( width = 600, height = 500, template="plotly_dark", #ダークモード margin = {'b':5,'l':5,'r':5,'t':5}, geo = dict( resolution = 50, landcolor = 'white', #陸地の色 lataxis = dict( range = [25, 47], #地図表示範囲(緯度) ), lonaxis = dict( range = [126, 150], #地図表示範囲(経度) ), ) ) } ), ), # 右グラフ dbc.Col( dcc.Graph( id = 'Pref', figure = { 'data' : [ pgo.Bar( x=ccb_prep['収穫量'], y=ccb_prep['都道府県'], orientation='h' #横棒グラフ ), ], 'layout' : pgo.Layout( width = 400, height = 500, template = "plotly_dark", #ダークモード margin = {'b': 5, 'l': 5, 'r': 5, 't': 5}, xaxis_title = "収穫量", yaxis_title = "都道府県" ) } ), ), ], ), ], )
5. アプリ起動処理
最後にWebアプリ起動処理です。Dashはホットリロード機能を持っており、コードに変更があった場合に、自動でブラウザをリフレッシュします。
# アプリを起動 if __name__ == "__main__": app.run_server(debug=True)
最後に
キュウリの生育適温は20〜25℃。暖かくなり始めた5月の連休頃が植え付け時期となります。夏の生育期のキュウリは1日3cm以上も大きくなります。実家の庭で、朝小さかったキュウリが昼過ぎにはすっかり大きくなっていて、びっくりしたこともありました。ベランダ菜園始めようかしら。