実現したいこと
Excelデータからヒートマップを作成したい
現時点での結果
データの中身
1 2 3 4 5 6 7 8 10 11 12 13 0 0.441917 0.571579 0.668751 0.527957 0.370908 0.584363 0.486324 0.370908 0.767294 0.658079 0.321843 0.396239 1 0.492767 0.640370 0.651971 0.527950 0.554962 0.617620 0.504206 0.539643 0.579781 0.666144 0.370908 0.449357 2 0.448931 0.692970 0.650659 0.697246 0.642706 0.635657 0.689731 0.695371 0.721158 0.621455 0.553356 0.450163 3 0.487369 0.605293 0.650659 0.664098 0.682370 0.718008 0.632971 0.654054 0.614775 0.692358 0.597424 0.597116 4 0.412695 0.737857 0.754797 0.687051 0.670295 0.739909 0.623594 0.649123 NaN 0.723128 0.580822 0.571987 .. ... ... ... ... ... ... ... ... ... ... ... ... 146 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.711146 NaN 147 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.731036 NaN 148 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.780622 NaN 149 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.802218 NaN 150 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 0.826274 NaN
該当のソースコード
python
1import pandas as pd 2import seaborn as sns 3import matplotlib.pyplot as plt 4import numpy as np 5 6path=r"C:\test\Book3.xlsx" 7df=pd.read_excel(path) 8print(df) 9sns.heatmap(df,yticklabels='0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0', square=True) 10plt.show()
質問
x軸を1から13
y軸を0~1までにして0.1ごとに区切りたいです.
また,正方形にしたいです.
現時点でだとこのようにぐちゃぐちゃになってしまっている状態です.
yticklabelsなしだと,y軸には行が表示されます.(1から150までの数字が)
square=Trueにしても四角形にうまくなりません.
元のデータが悪いんでしょうか?
どうすればいいですか?
以前にもこの質問はさせて頂きました.
また,改めてわからないことがあったので,質問させて頂きました.
四角形にはなってます。単にxに対してyの総数が多すぎて全体が縦長になってるだけです。

なるほど.これを綺麗に四角形にするには元データをどのようにすればいいですか?
1 0.4444
1 0.4444
1 0.5
1 0.1
.....略します
13 0.4444
みたいにすればいいでしょうか?

また,yticklabelが上手く表示されていない状態なので,これも改善したいです
> 正方形にしたい
「sns.heatmap」に「square=True」を付けずに、
https://www.delftstack.com/ja/howto/seaborn/size-of-seaborn-heatmap/
で説明されてる三つの方法のどれかで縦横のサイズをそれぞれ指定したら、グラフのサイズは変えられるはずです
(三つの方法のどれも、指定する数値の順番は「横, 縦」です)
なお、三つ目の方法は、「sns.heatmap」と「plt.show()」の間に追加します
> y軸を0~1までにして
df = df.set_axis(np.linspace(0, 1, df.shape[0]), axis=0)
として、「sns.heatmap」に「yticklabels=...」を付けなければ、縦軸の数値が0.0~1.0になるはずです
(数値が重ならないように間引かれて表示されるので、一番下に表示されるのは「1.0」ではないかもしれませんが)

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import plotly.express as px
sns.set()
path=r"C:\test\Book3.xlsx"
df=pd.read_excel(path)
df=df.set_axis(np.linspace(0, 1, df.shape[0]),axis=0)
print(df)
plt.figure(figsize=(13,13))
sns.heatmap(df)
plt.show()

このようにコードを修正しました.

実行結果も修正しなおしました.y軸を0から1までにして0.1ごとに目盛りを付けたい場合はどのようにすればいいでしょうか?
> y軸を0から1までにして0.1ごとに目盛りを付けたい
sns.heatmap(df)
↓ 変更
heat_map = sns.heatmap(df)
heat_map.set_yticks(np.arange(0, df.shape[0], 0.1*df.shape[0]).astype('int'))
heat_map.set_yticklabels((np.arange(0, df.shape[0], 0.1*df.shape[0])/df.shape[0]).round(1))
で、一番下の「1.0」以外は表示されると思います
