なんでもpythonの時代、と思っているのは私だけ??
なんでもpythonでやってみましょう。
お絵描きです。
エクセルでごにょごにょ色付きの表をあれこれ。
ヒートマップ
以下はヒートマップを作るサンプル。
Python
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import io
import base64
ROWS_N = 20
COLS_N = 5
np.random.seed(0)
rows = [f"row{i+1:02d}" for i in range(ROWS_N)]
cols = [f"C{i+1}" for i in range(COLS_N)]
# まず数値で作る
data = np.random.randint(0, 100, size=(ROWS_N, COLS_N)).astype(object)
df = pd.DataFrame(data, index=rows, columns=cols)
# ランダムに "-" を混ぜる(例:10個)
for _ in range(10):
i = np.random.randint(0, ROWS_N)
j = np.random.randint(0, COLS_N)
df.iat[i, j] = "-"
# ヒートマップ用("-" を NaN にして数値化)と、
# Warningの除去
# df_num = df.replace("-", np.nan).infer_objects(copy=False).astype(float)
df_num = df.apply(pd.to_numeric, errors="coerce")
plt.figure(figsize=(4, 6))
ax = sns.heatmap(
df_num, annot=True, fmt=".0f", linewidths=0.5, cbar=True # 数値だけ表示
)
# NaNの場所に "-" を描画する(ここが確実)
for i in range(df_num.shape[0]):
for j in range(df_num.shape[1]):
if np.isnan(df_num.iat[i, j]):
ax.text(
j + 0.5,
i + 0.5,
"-",
ha="center",
va="center",
color="black",
fontweight="bold",
)
plt.title('"-" cells are excluded from heatmap')
plt.tight_layout()
# plt.show()
# --- ここがポイント:PNGをメモリに保存
buf = io.BytesIO()
plt.savefig(buf, format="png", dpi=200)
plt.close()
buf.seek(0)
# base64化
img_b64 = base64.b64encode(buf.read()).decode("utf-8")
# HTML埋め込み
html = f"""
<html>
<body>
<h2>Heatmap</h2>
<img src="data:image/png;base64,{img_b64}" />
</body>
</html>
"""
with open("heatmap_embed.html", "w", encoding="utf-8") as f:
f.write(html)
print("saved: heatmap_embed.html")
実行すると、以下のようなhtmlファイルが完成します。どうぞ。


コメント