web-dev-qa-db-ja.com

Geopandasのカラーバー

GeoPandasでMatplotlibカラーバーを作成しようとしています。

import geopandas as gp
import pandas as pd
import matplotlib.pyplot as plt

#Import csv data
df = df.from_csv('data.csv')

#Convert Pandas DataFrame to GeoPandas DataFrame
g_df = g.GeoDataFrame(df)

#Plot
plt.figure(figsize=(15,15)) 
g_plot = g_df.plot(column='column_name',colormap='hot',alpha=0.08)
plt.colorbar(g_plot)

次のエラーが発生します。

AttributeError                            Traceback (most recent call last)
<ipython-input-55-5f33ecf73ac9> in <module>()
      2 plt.figure(figsize=(15,15))
      3 g_plot = g_df.plot(column = 'column_name', colormap='hot', alpha=0.08)
----> 4 plt.colorbar(g_plot)

...

AttributeError: 'AxesSubplot' object has no attribute 'autoscale_None'

カラーバーを機能させる方法がわかりません。

10
Jack_The_Ripper

編集:以下で参照されているPRは、geopandasマスターにマージされました。今、あなたは簡単に行うことができます:

gdf.plot(column='val', cmap='hot', legend=True)

カラーバーが自動的に追加されます。

ノート:

  • legend=TrueはGeopandasにカラーバーを追加するように指示します。
  • colormapcmapと呼ばれるようになりました。
  • vminvmaxはもう必要ありません。

詳細については、 https://geopandas.readthedocs.io/en/latest/mapping.html#creating-a-legend を参照してください(カラーバーのサイズと配置を調整する方法の例を含む)。


これをgeoapandasに追加するPRがあります( https://github.com/geopandas/geopandas/pull/172 )が、今のところ、この回避策を使用して自分で追加できます。

## make up some random data
df = pd.DataFrame(np.random.randn(20,3), columns=['x', 'y', 'val'])
df['geometry'] = df.apply(lambda row: shapely.geometry.Point(row.x, row.y), axis=1)
gdf = gpd.GeoDataFrame(df)

## the plotting

vmin, vmax = -1, 1

ax = gdf.plot(column='val', colormap='hot', vmin=vmin, vmax=vmax)

# add colorbar
fig = ax.get_figure()
cax = fig.add_axes([0.9, 0.1, 0.03, 0.8])
sm = plt.cm.ScalarMappable(cmap='hot', norm=plt.Normalize(vmin=vmin, vmax=vmax))
# fake up the array of the scalar mappable. Urgh...
sm._A = []
fig.colorbar(sm, cax=cax)

回避策は Matplotlib-ラインプロットのシーケンスにカラーバーを追加する から来ています。また、vminvmaxを自分で指定する必要があるのは、データ自体に基づいてカラーバーが追加されないためです。したがって、値と色の間のリンクを指示する必要があります。

29
joris