

xy平面上に存在するz軸方向への強度を二次元マッピングを用いてグラフ化したいです。  
その際データ間の点は補間し滑らかにつなぐことを想像しています。

データはCSV形式で保存しており、1行目はx軸の値、1列目はy軸の値を入れているようなデータです。  
CSVデータを画像で添付します。画像のようなCSVです。

[![グラフ描画を行いたいCSV](https://i.stack.imgur.com/7CLnc.png)](https://i.stack.imgur.com/7CLnc.png)

[Python, Matplotlibによるデータの可視化](https://ritsuan.com/blog/8849/)
に掲載されているコードを流用し、以下のようにしています。

**実行環境:**  
Python 3.9.7  
numpy 1.20.3  
matplotlib 3.4.3  
Jupyter Notebook 6.4.5

**ソースコード:**

[code]

    import math 
    import numpy as np
    import matplotlib.pyplot as plt
    
    #データ読み込み
    p2 =np.loadtxt ('Book1.csv', delimiter=',')
    
    #軸作成
    xx,yy= [],[]
    x= p2[0,:]
    y= p2[:,0]
    x= x[1:]
    y= y[1:]
    
    for num in range(len(x)):
        xx.append(x)
    for num in range(len(y)):
        yy.append(y)
    X=np.array(xx)
    Y=np.array(yy).T
    
    #データに次元配列作成
    p2 = np.delete(p2,0,1)
    p2 = np.delete(p2,0,0)
    
    #描画
    plt.contourf(X,Y,p2,100)
    plt.xlabel('x')
    plt.ylabel('y')
    plt.colorbar()
    plt.show()
    
[/code]

上記を実行すると `#描画` のところでJupyter Notebookでエラーが出ます。  
具体的には以下のような内容です。

[code]

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    ~\AppData\Local\Temp/ipykernel_38072/1389352252.py in <module>
          1 #描画
    ----> 2 plt.contourf(X,Y,p2)
          3 plt.xlabel('x')
          4 plt.ylabel('y')
          5 plt.colorbar()
    
    ~\anaconda3\lib\site-packages\matplotlib\pyplot.py in contourf(data, *args, **kwargs)
       2743 @_copy_docstring_and_deprecators(Axes.contourf)
       2744 def contourf(*args, data=None, **kwargs):
    -> 2745     __ret = gca().contourf(
       2746         *args, **({"data": data} if data is not None else {}),
       2747         **kwargs)
    
    ~\anaconda3\lib\site-packages\matplotlib\__init__.py in inner(ax, data, *args, **kwargs)
       1359     def inner(ax, *args, data=None, **kwargs):
       1360         if data is None:
    -> 1361             return func(ax, *map(sanitize_sequence, args), **kwargs)
       1362 
       1363         bound = new_sig.bind(ax, *args, **kwargs)
    
    ~\anaconda3\lib\site-packages\matplotlib\axes\_axes.py in contourf(self, *args, **kwargs)
       6432     def contourf(self, *args, **kwargs):
       6433         kwargs['filled'] = True
    -> 6434         contours = mcontour.QuadContourSet(self, *args, **kwargs)
       6435         self._request_autoscale_view()
       6436         return contours
    
    ~\anaconda3\lib\site-packages\matplotlib\contour.py in __init__(self, ax, levels, filled, linewidths, linestyles, hatches, alpha, origin, extent, cmap, colors, norm, vmin, vmax, extend, antialiased, nchunk, locator, transform, *args, **kwargs)
        775         self._transform = transform
        776 
    --> 777         kwargs = self._process_args(*args, **kwargs)
        778         self._process_levels()
        779 
    
    ~\anaconda3\lib\site-packages\matplotlib\contour.py in _process_args(self, corner_mask, *args, **kwargs)
       1364             self._corner_mask = corner_mask
       1365 
    -> 1366             x, y, z = self._contour_args(args, kwargs)
       1367 
       1368             _mask = ma.getmask(z)
    
    ~\anaconda3\lib\site-packages\matplotlib\contour.py in _contour_args(self, args, kwargs)
       1422             args = args[1:]
       1423         elif Nargs <= 4:
    -> 1424             x, y, z = self._check_xyz(args[:3], kwargs)
       1425             args = args[3:]
       1426         else:
    
    ~\anaconda3\lib\site-packages\matplotlib\contour.py in _check_xyz(self, args, kwargs)
       1471         elif x.ndim == 2:
       1472             if x.shape != z.shape:
    -> 1473                 raise TypeError(
       1474                     f"Shapes of x {x.shape} and z {z.shape} do not match")
       1475             if y.shape != z.shape:
    
    TypeError: Shapes of x (11, 11) and z (15, 11) do not match
    
[/code]

これらを解決し、2次元グラフを出したいです。  
また別の方法でお分かりになられる方がいましたらそちらでも構いません。  
どうかご教授ください、何卒よろしくお願いします。

※この質問は[二次元マップをpythonを用いて作成したい](https://ja.stackoverflow.com/questions/83991/%E4%BA%8C%E6%AC%A1%E5%85%83%E3%83%9E%E3%83%83%E3%83%97%E3%82%92python%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%81%84)を基に内容を一部改変し新規で立てています。


CC BY-SA 4.0
2021-12-08T01:52:46.250
84015
2023-10-28T04:04:10.600
2021-12-08T06:04:00.720
3060
48018
question
python python3 matplotlib
二次元グラフ(マップ)をpythonを用いて作成したい


質問に提示された16行・12列のCSVデータを使うと、`contourf()`に指定するパラメータの`shape`がバラバラになって合わないためにエラーが発生していると考えられます。

`plt.contourf(X,Y,p2,100)`を呼び出す時点で見てみると：

`X`の`shape`が`(11,11)`  
`Y`の`shape`が`(15,15)`  
`p2`の`shape`が`(15,11)`

になっています。  
一方参照先記事では、`plt.contourf(Y,Z,p2,100)`の`Y`,`Z`,`p2`の`shape`は全部`(17,17)`になっています。

参照先記事では、以下の部分(およびその前後)の記述が関連しているでしょう。

>
> contourf関数では，2次元座標yzの各点での値p2を等高線として描画し，さらに塗りつぶしています．このyz各点での値を用いて処理する際，p2にyz各点の座標を与えてやる必要があります．  
>  つまり，2次元配列のyとzとp2を重ねたときに，各位置でy,z,p2の値を一致させてやる必要があるということです．

おそらく個々の配列の行数と列数を同じ数にする必要は無いけれども、3つの配列の行数と列数は同じ数にしなければならないのでしょう。

対処としては、プログラム上で各配列が同じに`shape`になるように調整するか、プログラムはそのままでCSVデータの行数と列数で調整するか、のいずれかでしょう。

コメントに書いたように、CSVデータで調整する場合は行数を12行に減らせば動作するでしょう。


CC BY-SA 4.0
2021-12-08T05:29:08.730
84020
2021-12-08T05:29:08.730
26370
84015
answer