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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5348閲覧

python heatmapのメモリ位置をずらす方法、右端のデータを表示する方法

mor1mi

総合スコア1

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/10/17 21:41

編集2020/10/18 02:39

前提・実現したいこと

Pythonで実験で得たデータを解析しています。
例えばある物理量の時間依存の温度依存性をとったとして、
色で強度を表した二軸のカラーマップを作成したいです。
plt.pcolor()を使用してかなり近いことはできているんですが、
軸が意図したものと違っていて困っています。

python

1x=np.arange(1,1001,1)*1e-3 #time 2y=np.arange(20,151,10) #temp 3(i,j)=(0,0) 4Z=np.zeros((len(x),len(y))) 5for X in x: 6 for Y in y: 7 Z[i][j]=10*(1-np.exp(-X/10*Y)) 8 if Y==20: 9 Z[i][j]=1 10 if Y==150: 11 Z[i][j]=1 12 j+=1 13 i+=1 14 j=0 15plt.pcolor(y,x,np.log(Z)) 16plt.yscale('log') 17plt.show() 18plt.close()

出力画像
出力画像
20Cなどのメモリ位置がデータの左側に
表示されるため、25Cのデータのように見える。
X軸をずらしてメモリ位置を各データの真下にできますか?
また150Cのデータが表記されません。
この問題を解決する方法を教えてください。

試したこと

plt.pcolor()ではlog表記できますが、X軸の位置がおかしいです。seaborn.heatmap()は、X軸の位置は良く全てのデータを表示できるのですが、
Y軸のlog表記を達成する方法が分かりませんでした。

python

1df = pd.DataFrame(data=Z, columns=y,index=x) 2ax = seaborn.heatmap(df)

出力画像
イメージ説明

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2020/10/17 22:37

質問がよくわからないので、「前提・実現したいこと」に質問を記述してください。 > 軸が意図したものと違っていて困っています 意図したもの、とは何でしょうか? > Y軸をlogで表記できる解決策を教えて logで表記できています。 「発生している問題・エラーメッセージ」は質問を表記するところではありませんが、そこも意味がわかりませんでした。 > 150Cのデータは恐らく見えていない。 見えているのでは? > 20Cなどもできれば、棒グラフのように真下にあるほうが良い x軸は20以上しかデータが無いのであたりまえでは?無理やり見た目をずらしたら(簡単にできますが)図の中に空白ができちゃいますが、よいのでしょうか?
mor1mi

2020/10/18 02:03

修正しました。seabornのheatmapならXの値を真下に表記できるのですが、Y軸をlog表記できませんでした。
meg_

2020/10/18 02:13

Y軸はlog表示されてますよね?
mor1mi

2020/10/18 02:18

plt.pcolor()ではlog表記できますが、X軸の位置がおかしいです。seaborn.heatmap()は、X軸の位置は良いのですが、Y軸のlog表記を達成できませんでした。
meg_

2020/10/18 02:28

・質問者さんが表示したいグラフ画像(手書きでも可) ・plt.pcolor()でのコードとグラフ画像 ・seaborn.heatmap()でのコードとグラフ画像 を質問に書かないと状況が回答者に伝わりません。
meg_

2020/10/18 02:32

> また150Cなど、右端に来るべきデータが表記されません。 これについてはグラフにデータは表示されています。軸ラベルが表示されていないだけですね。
mor1mi

2020/10/18 02:43 編集

meg_さん: ありがとうございます。 すみません、分かりにくくて申し訳ありませんでした。 追加しました。これでどうでしょうか。 >これについてはグラフにデータは表示されています。軸ラベルが表示されていないだけですね。 本当ですか?
toast-uz

2020/10/18 03:16

print(plt.xlim())で表示範囲が出ますので確認してみてください
guest

回答2

0

ベストアンサー

seabornでやってみました。
※手動でラベル付けしているため正確な値からは多少ずれることがあります。

Python

1import numpy as np 2import matplotlib.pyplot as plt 3import matplotlib.ticker as ticker 4import pandas as pd 5import seaborn as sns 6 7 8x=np.arange(1,1001,1)*1e-3 #time 9y=np.arange(20,151,10) #temp 10 11 12(i,j)=(0,0) 13Z=np.zeros((len(x),len(y))) 14for X in x: 15 for Y in y: 16 Z[i][j]=10*(1-np.exp(-X/10*Y)) 17 j+=1 18 i+=1 19 j=0 20 21df = pd.DataFrame(Z, columns=y,index=x) 22 23tick = ticker.ScalarFormatter(useOffset=False, useMathText=True) 24tick.set_powerlimits((0,0)) 25 26tg = ["${}$".format(tick.format_data(10**i)) for i in np.arange(np.floor(np.min(np.log10(x))), np.ceil(np.max(np.log10(x))) + 1, 1)] 27 28ax = sns.heatmap(df, yticklabels=len(df)//len(tg)) 29ax.set_yticklabels(tg) 30 31 32plt.show()

イメージ説明

参考:How to use scientific notation in seaborn heatmap labels?

投稿2020/10/18 05:02

編集2020/10/18 05:04
meg_

総合スコア10760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toast-uz

2020/10/18 05:23

x軸を離散値と捉えて、飛び飛びの値を中心としたヒストグラムにしたのですね。温度という連続量なので、ヒストグラムという発想には気付きませんでした。確かに、質問者様とののやりとりを振り返ると、ヒストグラムを要望されているように感じます。
mor1mi

2020/10/18 18:38

非常に助かりました!meg_さん、toast-uzさん、ありがとうございました!
guest

0

質問者様の要望を以下のように解釈しました。

  • x軸は20〜150のデータがあり、150まで描画されているが、データ範囲の外側もマージンをとって描画したい。
  • y軸は、既にlog表記はできているが、さらに目盛数値の指数部だけを表示したい。

plt.show()の前に以下2行を入れてください。

Python

1plt.yticks([0.001, 0.01, 0.1, 1], ['-3', '-2', '-1', '0']) 2plt.xlim(10, 160)

なお、yticksを自動描画する方法も無きにしも非ずですが、このやり方が手っ取り早いようです。きっと、どなたかがチャレンジしてくれるでしょう。subplotを使う例しか見当たらず、調べきれませんでした。

描画結果は以下です。

イメージ説明

投稿2020/10/18 04:46

編集2020/10/18 04:49
toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mor1mi

2020/10/18 12:49

ありがとうございます。申し訳ないのですが、やはりplt.pcolor()では、150のデータは表示されていません。データを見て頂けますと、150には、確認のために、20Cと同じデータを入れております。しかしながら、表示ではそれが確認できません。
toast-uz

2020/10/18 13:06

20, 30, 40, ・・・, 150 を離散値としてみて、ヒストグラムを表示させたいのでしょうか? ヒストグラムであれば、150が「一定の幅を持って」表示されるべきなのは理解します。 私は、温度なので連続値であると解釈しまたした。連続値だとすると150は「右端」ですので、150のところの値は縦線未満として見えなくなってしまいます。
mor1mi

2020/10/18 18:32

なるほど。離散値とみて、ヒストグラムを表示させたいというのが、toast-uzさんの言葉での私の要望のようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問