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

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

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

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

2回答

1806閲覧

pandasで二次元座標からheatmapを作りたい

German_p0tat0

総合スコア26

DataSet

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

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

Python

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2022/11/15 10:27

編集2022/11/16 14:51

前提

y,z座標の視線データの配列から、pandasでヒートマップを作りたいと思っています。

イメージ:https://pythonbasics.org/seaborn-heatmap/

実現したこと

ここに実現したことを箇条書きで書いてください。
① txtファイルからy,zにデータを格納(連番ではない)
②二次元配列に[y, z, 重複した回数]として格納

データの例(省略):
[['-854.564', '-92.653', 1], ['-856.039', '-85.4', 2], ['-854.958', '-87.016', 2], ['-881.358', '-115.083', 2], ['-881.337', '-117.82', 9], ['-874.907', '-80.494', 2], ['-872.105', '-80.82', 1], ['-871.114', '-81.154', 1], ['-870.602', '-79.852', 1], ['-869.552', '-80.692', 1], ['-869.194', '-79.456', 1]]

該当のソースコード

python

1import pandas as pd 2import numpy as np 3import seaborn as sns 4import re 5import matplotlib.pyplot as plt 6 7#① 8if __name__ == "__main__": 9 pts = [] 10 file_path = "gaze_data_location.txt" 11 with open(file_path) as f: 12 y = [] 13 z = [] 14 i = 0 15 lines = f.read().splitlines() 16 for line in lines: 17 new_str = re.search(r'Y=(.+)',line).group(1) 18 get_y = re.search(r'(.+)\sZ=',new_str).group(1) 19 y.append(float(get_y)*-1) 20 get_z = re.search(r'Z=(.+)',new_str).group(1) 21 z.append(float(get_z)) 22 pts.append((y[i],z[i])) 23 i += 1 24#② 25 y_str = [str(n) for n in y] 26 z_str = [str(n) for n in z] 27 l = [] 28 for i in range(len(y_str)): 29 flag = True 30 for j in range(len(l)): 31 if y_str[i] in l[j][0] and z_str[i] in l[j][1]: 32 flag = False 33 l[j][2] = l[j][2] + 1 34 if flag is True: 35 l.append([y_str[i],z_str[i],1])

考え

イメージとしてはpandasの行、列にy,zを振り分けて値に重複回数を入れたいのですが、やり方がわからないです。

補足

イメージ説明
図1:目標はこのような感じで滑らかなヒートマップ

イメージ説明
図2

python

1plt.hist2d(y, z, bins=(500, 500), cmap=plt.cm.Greys) 2plt.xlim(-1000, -825) 3plt.ylim(120, 225) 4plt.show()

イメージ説明
図3

python

1fig, ax = plt.subplots(figsize =(100, 57)) 2plt.hexbin(y, z, bins = 10000, cmap=plt.cm.binary) 3ax.set_xlabel('X-axis') 4ax.set_ylabel('Y-axis') 5plt.xlim(-1000, -825) 6plt.ylim(120, 225) 7plt.tight_layout() 8plt.show()

イメージ説明
図4

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

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

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

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

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

bsdfan

2022/11/16 00:22

ヒートマップを作るのが目的ならば、①で作った y, z で、matplotlib.pyplot.hist2d か seaborn.histplot を使ってプロットすることができると思います。 ②については、文字列に変換している理由はなんでしょうか? また、ヒートマップを作りたいなら、値が完全に一致する点を数えるのではなく、範囲に入っているものを数えていくほうがいいように思えるのですが、やりたいことをもう少し説明お願いします。
German_p0tat0

2022/11/16 08:51

ご返信ありがとうございます。 目的としましては図1(別のプログラムで作った)のようなヒートマップを作りたいです。 文字列に変化した経緯は if y_str[i] in l[j][0] and z_str[i] in l[j][1]: ここでfloatだとダメとエラーが出たからです。 私はseaborn.heatmapを使うために前処理をしていたつもりなのですが、matplotlib.pyplot.hist2d や seaborn.histplotがあるのですね調べてみます。ありがとうございます。 また、前者で進めるとしたら、難しいでしょうか?
German_p0tat0

2022/11/16 09:37

追記:matplotlib.pyplot.hist2dで実行してみた(図2,図3)のですが、binの値を調節しても図1のように滑らかにならないのと、閾値が変えられないせいか全体的に薄くなりました。目標としてはグレースケールでプロットされてる所とされてない所の色の差が大きくなってほしいです。
bsdfan

2022/11/16 11:57

目標に近いのは seaborn.kdeplot のような気がします。 上記のカーネル密度推定は簡単ではないですが、シンプルなヒートマップなら手動でも、縦と横の要素数の二次元配列を用意して、データを数えていけばできると思います。(numpy.histgram2dを使えば一発ですが)
German_p0tat0

2022/11/16 14:54 編集

ご返信ありがとうございます。 seaborn.kdeplotでパラメータを調節した結果を図4に追加しました。イメージに近いのですが、カーネル密度推定を表示しているせいか、表示が大まか(ぼやけてる)になってしまいます。 matplotlib.pyplot.hist2dのように細かいデータもありつつ、seaborn.kdeplotのような滑らかに表示させたいです。。。
bsdfan

2022/11/17 01:21

bw_adjust で調整できないでしょうか。デフォルトが1で、小さくしていけばいいと思います。どれぐらいが最適かは実際のデータで試してもらわないとわかりません。
German_p0tat0

2022/11/17 11:14

それなのですが、僕も0.5以下にして試したのですが、以下のようなエラーが出てしまうんですよね。 ValueError: Contour levels must be increasing
bsdfan

2022/11/17 14:41

エラーについては、ちょっとわからないです。データの分布が偏ってるとかなんでしょうか。 できそうなのは、その他のパラメータいじって試してみるぐらいか、 もしくはnumpy.histgram2dで二次元マップを作って、matplotlib.pyplot.contourf を試してみるかですかね。こちらの方が閾値とかは簡単に調整できるかも。 あまりお役に立てずすいません。
German_p0tat0

2022/11/21 09:37

ご返信ありがとうございます。 はい、ほかのパラメータもAPI referenceやったのですが、うまくいかなかったです。 また、今考えている原因としては、データの範囲が大きすぎるのではないかという点なので、調整していこうと思います。 長々とお世話をかけました、ご協力ありがとうございました!
guest

回答2

0

import numpy as np import matplotlib.pyplot as plt x=[] y=[] xedges=[] zedges=[] x = df["X"].to_list() y = df["Y"].to_list() xedges=xdege zedges=zdege H, xedges, zedges = np.histogram2d(x, y, bins=(xedges, zedges)) H = H.T X, Y = np.meshgrid(xedges, zedges) ax.pcolormesh(X, Y, H) plt.show()

こんなんでいかがでしょうか?
なめらかとは程遠いですが・・・・・

投稿2022/11/23 05:08

icemanstanding

総合スコア73

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

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

German_p0tat0

2022/11/28 14:24

ご返信ありがとうございます。 参考にさせていただきます。。
guest

0

以下を試してみてはどうでしょうか?

  • contour plot を使う
  • scatter plot で size=重複回数

モノクロ縛りがなければ、色を適用するのもあり

投稿2022/11/18 02:45

fpfpfp

総合スコア55

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

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

German_p0tat0

2022/11/21 09:23

ご返信ありがとうございます。 参考にしてみます。 ただ、顕著性マップと差分を取りたいので、モノクロのほうが都合がいいかなと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問