質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

受付中

ヒートマップ作成したい

LiLL
LiLL

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1回答

0グッド

0クリップ

278閲覧

投稿2022/12/02 04:00

編集2022/12/02 08:23

実現したいこと

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にしても四角形にうまくなりません.
元のデータが悪いんでしょうか?
どうすればいいですか?

以前にもこの質問はさせて頂きました.
また,改めてわからないことがあったので,質問させて頂きました.

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

pig_vba

2022/12/02 04:13

四角形にはなってます。単にxに対してyの総数が多すぎて全体が縦長になってるだけです。
LiLL

2022/12/02 04:18

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

2022/12/02 04:19

また,yticklabelが上手く表示されていない状態なので,これも改善したいです
jbpb0

2022/12/02 06:32 編集

> 正方形にしたい 「sns.heatmap」に「square=True」を付けずに、 https://www.delftstack.com/ja/howto/seaborn/size-of-seaborn-heatmap/ で説明されてる三つの方法のどれかで縦横のサイズをそれぞれ指定したら、グラフのサイズは変えられるはずです (三つの方法のどれも、指定する数値の順番は「横, 縦」です) なお、三つ目の方法は、「sns.heatmap」と「plt.show()」の間に追加します
jbpb0

2022/12/02 06:47 編集

> 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」ではないかもしれませんが)
LiLL

2022/12/02 09:57 編集

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()
LiLL

2022/12/02 08:22

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

2022/12/02 08:24

実行結果も修正しなおしました.y軸を0から1までにして0.1ごとに目盛りを付けたい場合はどのようにすればいいでしょうか?
jbpb0

2022/12/05 08:23 編集

> 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」以外は表示されると思います

回答1

0

正方形にしたい

「sns.heatmap」に「square=True」を付けずに、
Seaborn ヒートマップのサイズを設定する
で説明されてる三つの方法のどれかで縦横のサイズをそれぞれ指定したら、グラフのサイズは変えられるはずです
(三つの方法のどれも、指定する数値の順番は「横, 縦」です)

なお、三つ目の方法は、「sns.heatmap」と「plt.show()」の間に追加します

 

y軸を0~1までにして0.1ごとに区切りたい

python

1sns.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)

↓ 変更

python

1heat_map = sns.heatmap(df) 2heat_map.set_yticks(np.arange(0, df.shape[0], 0.1*df.shape[0]).astype('int')) 3heat_map.set_yticklabels((np.arange(0, df.shape[0], 0.1*df.shape[0])/df.shape[0]).round(1))

で、一番下の「1.0」以外は表示されると思います

投稿2022/12/05 08:02

編集2022/12/05 08:26
jbpb0

総合スコア7487

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。