⇨Python関連の記事一覧
⇨PythonのPlotly関連の記事一覧
import pandas as pd
import matplotlib.cm as cm
import plotly
import plotly.express as px
import plotly.io as pio
# ファイル保存用の接頭辞
prefix = 'tws-compare'
# 記事リンクボタンのベースURLとaタグ設定
base_url = 'https://megatenpa.com/gadget/tws/'
target = " target='_blank'"
rel = " rel='noopener noreferrer'"
print('------------------------------------------------------------')
# csvデータを取得
df = pd.read_csv('data.csv', index_col=0)
print(df)
# Jabra [Elite 75t] ... SOUNDPEATS [Opera 03]
# 項目 ...
# 本体再生時間(ANCあり) 5.5 ... 6.3
# 本体再生時間(ANCなし) 7.5 ... 9
# ノイキャン低音 7 ... 8
# ノイキャン高音 4 ... 6
# 外音取り込み 9 ... 5
# ドライバーサイズ 6 ... 12
# 音質低音 8 ... 7
# 音質高音 5 ... 7
# 操作性 8 ... 5
# アプリの使いやすさ 8 ... 5
# 付加機能 5 ... 4
# 防水(IPX○) 5 ... 4
# 防塵(IP○X) 5 ... 0
# デザイン 6 ... 8
# ランキング '圏外' ... '圏外'
# パーマリンク 'jabra-elite75t' ... 'soundpeats-opera-05-03'
# [16 rows x 15 columns]
# Plotlyでグラフ化しやすいように成形
df_format = pd.DataFrame(columns=['項目', 'スコア', 'TWS'])
for index, column in enumerate(df.columns):
df_tmp = pd.DataFrame(
data={
'項目': pd.Series(df.index).values[:-2],
'スコア': (df[column].values[:-2]).astype(float),
'TWS': [column] * (len(df) - 2)
}
)
df_format = pd.concat([df_format, df_tmp], ignore_index=True)
del df_tmp
print(df_format)
# 項目 スコア TWS
# 0 本体再生時間(ANCあり) 5.5 Jabra [Elite 75t]
# 1 本体再生時間(ANCなし) 7.5 Jabra [Elite 75t]
# 2 ノイキャン低音 7.0 Jabra [Elite 75t]
# 3 ノイキャン高音 4.0 Jabra [Elite 75t]
# 4 外音取り込み 9.0 Jabra [Elite 75t]
# .. ... ... ...
# 205 アプリの使いやすさ 5.0 SOUNDPEATS [Opera 03]
# 206 付加機能 4.0 SOUNDPEATS [Opera 03]
# 207 防水(IPX○) 4.0 SOUNDPEATS [Opera 03]
# 208 防塵(IP○X) 0.0 SOUNDPEATS [Opera 03]
# 209 デザイン 8.0 SOUNDPEATS [Opera 03]
# [210 rows x 3 columns]
print('------------------------------------------------------------')
# ボタン作成
def set_menus():
menu = dict(
label='line or fill', method='update',
args=[dict(fill='toself'), dict()], # 塗りつぶしを追加
args2=[dict(fill=None), dict()], # 線だけ
)
menus = [menu]
return menus
# 各イヤホンのレビュー記事URL用のボタン作成
def set_link_menus():
menus = [dict(
label='記事のリンク↓', method='update',
args=[dict()],
args2=[dict()],
)]
for name in df.columns:
url = f"{base_url}{df[name]['パーマリンク']}"
link = f"<aタグ href='{url}'{target}{rel}>{name}</aタグ>" # aタグにするとWordPress上でリンクになるのでぼかす
menu = dict(
label=link, method='update',
args=[], args2=[],
)
menus.append(menu)
return menus
# 色付け用の関数
def set_color(data, alpha=1):
rgbas = []
for num, _ in enumerate(data):
cmap = cm.jet(num / len(data))
color = plotly.colors.convert_to_RGB_255(cmap) + (alpha,)
rgba = f"rgba{color}"
rgbas.append(rgba)
return rgbas
# ランキングに応じてグラフの初期表示を設定
def set_visible(fig, df):
for num, name in enumerate(df):
if df[name]['ランキング'] == "圏外":
fig['data'][num]['visible'] = 'legendonly'
else:
fig['data'][num]['visible'] = True
return fig
# figのレイアウトを編集
def update_fig_layout(fig, updatemenus):
fig.update_layout(
template='plotly_white',
updatemenus=updatemenus,
height=1000,
legend=dict(x=0, y=-0.1, xanchor='left', yanchor='top', orientation='h'),
# グラフ全体とホバーのフォントサイズ変更
font_size=20, hoverlabel_font_size=20,
)
return fig
# グラフ保存用の関数
def save(fig, config, save_name):
pio.orca.config.executable = '/Applications/orca.app/Contents/MacOS/orca'
pio.write_html(fig, f"{save_name}.html", config=config,)
pio.write_image(fig, f"{save_name}.png")
# 作成したグラフにHTMLコードを保存
html_code = fig.to_html(
include_plotlyjs='cdn', full_html=False, config=config,
)
with open(f"{save_name}.txt", mode='w') as f:
f.write(html_code)
print('------------------------------------------------------------')
# レーダーチャート
updatemenus = [
dict(
active=0, buttons=set_menus(), type='buttons', direction='right',
x=0.3, y=1.01, xanchor='center', yanchor='bottom', font_color='black'
),
dict(
active=0, buttons=set_link_menus(),
type='dropdown', direction='down',
x=0.7, y=1.01, xanchor='center', yanchor='bottom', font_color='black'
)
]
fig = px.line_polar(
df_format, r='スコア', theta='項目',
line_close=True, color='TWS', hover_data=df_format,
color_discrete_sequence=set_color(data=df),
)
fig.update_traces(fill='toself') # 初期表示は塗りつぶし
# 各点のホバーと塗りつぶし部分の許可
fig.for_each_trace(lambda t: t.update(hoveron='points+fills'))
fig = set_visible(fig, df)
fig = update_fig_layout(fig, updatemenus)
# fig.show()
# save(fig=fig, config=None, save_name=f"{prefix}_line_polar")
print('------------------------------------------------------------')
# 棒グラフ
fig = px.bar(
df_format, y='項目', x='スコア', barmode='group',
color='TWS', hover_data=df_format,
color_discrete_sequence=set_color(data=df, alpha=0.8),
range_x=(0, 12), orientation='h'
)
fig = set_visible(fig, df)
fig = update_fig_layout(fig, [updatemenus[1]])
# fig.show()
# save(fig=fig, config=None, save_name=f"{prefix}_bar")