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

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

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

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

NumPy

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

Python

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

Q&A

解決済

1回答

697閲覧

Pythonでグリッド線で囲まれた要素同士で大小比較がしたい

doraemon_pha

総合スコア5

Matplotlib

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

NumPy

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

Python

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

1グッド

0クリップ

投稿2020/08/30 03:56

グリッド線で囲まれた要素同士で大小比較がしたい

散布図の分布からヒートマップを作成しようとしています。
イメージとしてはお天気予報でよく見る一時間当たりの降水量を地図上にグラデーションで表示したものです。

python

1import numpy as np 2import matplotlib.pyplot as plt 3import matplotlib.patches as patches 4 5x=[55.67223758602455, 30.108582841413867, 47.46395249145441, 65.16622689511232, 85.2785758154654, 51.47064641104107, 52.19077757099717, 29.75178690758291, 81.35804295727367, 21.326138844661692, 7.278783138779888, 45.29573281395697, 49.7872336660233, 55.25850601870297, 54.71463189269652, 17.929397002471458, 31.806832572110476, 87.38591197993726, 56.54042101958359, 24.790980876827483] 6y=[37.71965570567662, 41.09652460777329, 35.864723605038954, 68.4018577450353, 99.10822304465938, 23.53444080851055, 70.26045933302932, 35.77767869296138, 18.860324832539334, 3.052337128542759, 2.6584220905937372, 37.353897599578154, 77.22291574221558, 74.75168411588986, 23.821291303711114, 4.661831370123415, 90.82483394959506, 85.64293297865865, 45.49483226724996, 93.42941061053084] 7z=[32.30609227115476, 8.911066923302402, 80.96228703944398, 27.989228015313216, 16.86909189836848, 85.20340846622177, 78.62773144424105, 53.07332876730821, 32.78160263761758, 61.855666035485726, 8.038600729991307, 62.86268680419319, 77.65079356995258, 78.07337335028801, 20.89658170737857, 23.092486015044134, 2.9057620958460206, 14.152163642879733, 2.448080214692372, 35.298630534877006] 8 9plt.figure(figsize=(5,5)) 10fig=plt.figure(figsize=(5,5)) 11ax1=fig.add_subplot(1,1,1) 12 13for i,j,k in zip(x,y,z): 14 ax2=plt.axes() 15 plt.scatter(i,j,s=[50],marker='.',color="red") 16 e1=patches.Ellipse(xy=(i,j), width=k/10, height=k/10, alpha=0.4, angle=0, color="red") 17 ax2.add_patch(e1) 18 19major_ticks = np.arange(-180, 181, 5) 20ax1.set_xticks(major_ticks) 21ax1.set_yticks(major_ticks) 22ax1.grid(which='major', alpha=0.5, linestyle=':') 23 24plt.xlim([0, 100]) 25plt.ylim([0, 100])#plt.plot([-180, 180], [0, 0],color="k",alpha=0.7) 26#plt.plot([0, 0], [-180, 180],color="k",alpha=0.7) 27plt.xlabel('X',fontsize=12) 28plt.ylabel('Y',fontsize=12) 29#plt.grid(linestyle='dotted') 30plt.show() 31

ここには縦軸横軸にx,y座標をとりプロットを行い、さらにプロットの重さ(zの値)を円で表示したものがあります。

この際に縦軸横軸ともに範囲は0~100なのですが、間隔が5のグリッド線を引きグリッド線同士によってできた5×5の格子を作成しそのエリアごとにz値の大小でグラデーションを付けたいと考えています。

そこで今問題なのが、一つの格子内にプロットが二つ以上存在するときに円の大きさが一番大きいもののz値をその格子の代表値として返したいのですが、

・5×5の格子をプログラムでどのように作成するのか
・幅5のグリッド間隔のために、20×20の格子を手打ちで入力するほかに格子ごとの判別が可能なのか

以上の二点で頭を悩ませておりました。
イメージ説明

具体的には、上の画像のうち45<=X<=50、35<=Y<=40に該当する5×5の格子内に二つプロットが存在しますが右側の大きな円を持つプロットのz値をこの格子の代表値にしたいということです

何かいい手法がございましたらご教授願いたいです。よろしくお願いいたします。

ForestSeo👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

一つの格子内にプロットが二つ以上存在するときに円の大きさが一番大きいもののz値をその格子の代表値として返したいのですが、

にかんしては、以下のように自力で20x20の箱を作って、そこに最大値を入れるようにすればよいでしょう。

Python

1pts = np.zeros((20,20,3)) 2for i,j,k in zip(x,y,z): 3 px, py = int(i//5), int(j//5) 4 if k > pts[px,py,2]: 5 pts[px,py,:] = np.array([i,j,k]) 6 7pts = pts.reshape(-1,3) 8x = pts[:,0] 9y = pts[:,1] 10z = pts[:,2]

イメージ説明

投稿2020/08/30 10:51

編集2020/08/30 10:51
can110

総合スコア38341

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

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

doraemon_pha

2020/08/31 03:54

can110様、ご回答ありがとうございます。 ご教授していただいたコードご導入したところ、掲載していただいたfigのように格子ごとに最大の値のみをプロットすることができました。ありがとうございます。 ここで初歩的な質問で申し訳ないのですが、pts=np.zeros((20,20.3))という部分でx,y,zの値はどのように格納されているのかが理解できませんでした。 もしよろしければnp.zerosの様式を教えていただけますでしょうか。よろしくお願いいたします。
can110

2020/08/31 03:57

20=100/5(グリッド幅), 3=x,y,zの最大値の3つの箱となります。
doraemon_pha

2020/08/31 04:19

理解出ました。 xyzの三つの値が入った箱が20×20個あるということですね。 詳しく教えてくださり本当にありがとうございます。
can110

2020/08/31 04:42

そのとおりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問