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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

Q&A

解決済

1回答

216閲覧

2Dマップに高さを付加したい

mega_ne

総合スコア16

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Python

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

0グッド

0クリップ

投稿2019/05/05 06:13

編集2019/05/05 09:38

前提・実現したいこと

h x y
16.780 329.399 42.232
16.806 329.023 42.052
13.317 329.270 42.124
14.469 328.675 41.868
15.511 329.196 41.957
16.706 329.374 42.217
16.051 329.501 42.265

横軸・縦軸ともに最小値を切り捨てしたものから最大値を切り上げした横軸2、縦軸2を0.1刻みで配列として作成しました。その軸の中で、ある横軸2の隣り合う2数の間に横軸の値が入り、かつ、縦軸2でも同様に値が入ったときのみ高さの値を取得し、その選ばれた高さを合計して高さ2としてヒートマップのような図を作成したいです。

該当のソースコード

python

1n = 0.1 #刻み 2H = [] 3x2 = np.arange(math.floor(np.min(x)), math.ceil(np.max(x)) + n/2, n) #最終的な横軸 4y2 = np.arange(math.floor(np.min(y)), math.ceil(np.max(y)) + n/2, n) #最終的な縦軸 5for i in range(len(x2)-1): 6 for j in range(len(y2)-1): 7 h2 = [h[k] for k in range(len(x)) if x2[i] <= x[k] < x2[i+1] and y2[j] <= y[k] < y[j+1]] 8 H.append(sum(h2)) #最終的な高さ

横軸2と縦軸2と高さ2はこれでできていると思っています。
完成のイメージは3Dプロットに色付けしたものを上から見る感じです。
できれば、高さ0のときは真っ黒で、0出ないときは高さが小さくなるほど白になるようにしたいです。

補足情報(FW/ツールのバージョンなど)

Python 2.7.15 |Anaconda|

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

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

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

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

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

can110

2019/05/05 07:29

インデントが消えているのでソースコードはコードブロックで囲んでください。 また、提示コード「h2 = [h[k] for ~」行においてIndexError:が発生しますので何等か修正が必要だと思われます。
guest

回答1

0

ベストアンサー

pcolormeshでおそらくそれらしいグラフが描画できます。

Python

1from io import StringIO 2import pandas as pd 3import numpy as np 4import math 5import matplotlib.pyplot as plt 6 7s = """h,x,y 816.780,329.399,42.232 916.806,329.023,42.052 1013.317,329.270,42.124 1114.469,328.675,41.868 1215.511,329.196,41.957 1316.706,329.374,42.217 1416.051,329.501,42.265""" 15df = pd.read_csv(StringIO(s)) 16x,y,h = df['x'].values,df['y'].values,df['h'].values 17 18n = 0.1 #刻み 19H = [] 20x2 = np.arange(math.floor(np.min(x)), math.ceil(np.max(x)) + n/2, n) #最終的な横軸 21y2 = np.arange(math.floor(np.min(y)), math.ceil(np.max(y)) + n/2, n) #最終的な縦軸 22H = [] 23for i in range(len(x2)-1): 24 for j in range(len(y2)-1): 25 h2 = [h[k] for k in range(len(x)) if x2[i] <= x[k] < x2[i+1] and y2[j] <= y[k] < y2[j+1]] 26 H.append(sum(h2)) #最終的な高さ 27 28H = np.array(H).reshape(len(x2)-1,-1) # 20x20 29X,Y = np.meshgrid(x2[0:-1],y2[0:-1]) # 20x20に合わせる 30 31fig,ax = plt.subplots() 32m = ax.pcolormesh(X,Y,H, cmap=plt.cm.gray) 33fig.colorbar(m)

イメージ説明

投稿2019/05/06 12:43

編集2019/05/08 00:08
can110

総合スコア38233

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

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

mega_ne

2019/05/07 11:39

質問の配列はあるデータの一部で、本当はデータ行が数十万くらいありtxtファイルに入っているので、データ読み込みでいきたいです... pandasでは難しいのであればpandasでなくても大丈夫です。 あと、この書き方の場合、カラーバーはどのようにプログラムを書けば付加されるのでしょうか。
can110

2019/05/08 00:10

回答コードでは例のため固定データを利用しています。 numpyのloadtxtなりpandasread_csvなりお好きな方法で読み込んでください。 また、カラーバーを表示するようにコード修正しました。
mega_ne

2019/05/10 03:18

返信が遅れてしまい、申し訳ございません。 少量のデータだとnumpyのloadtxtで読み込み作成できました。ありがとうございます。 しかし、上記のコードをnumpyのloadtxtで全データを読み込み動かしていたのですが、かなり時間がかかってしまいました。 for文のところを書き換えて早く処理できるようにすることは可能なのでしょうか。
can110

2019/05/10 06:25

ちょっとコードが思いつきませんが x,yに対応するhセル位置を特定する処理が高速化できれば可能かと思います。
mega_ne

2019/05/11 00:57

なるほど。 回答ありがとうございました。 とても勉強になりました。 また何かあれば質問すると思うので、その時はよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問