geopandas图和matplotlib图有什么区别?为什么不是所有关键字都可用?
在geopandas有标记大小,但没有标记gecolor ...
在下面的例子中,我绘制了一个带有一些样式的Pandasdf,然后将Pandasdf转换为geopandas df。简单的绘制是可行的,但没有额外的样式。
这只是一个例子。在我的geopandas图中,我想自定义标记、图例等。我如何访问相关的matplotlib对象?
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import geopandas as gpd
X = np.linspace(-6, 6, 1024)
Y = np.sinc(X)
df = pd.DataFrame(Y, X)
plt.plot(X,Y,linewidth = 3., color = 'k', markersize = 9, markeredgewidth = 1.5, markerfacecolor = '.75', markeredgecolor = 'k', marker = 'o', markevery = 32)
# alternatively:
# df.plot(linewidth = 3., color = 'k', markersize = 9, markeredgewidth = 1.5, markerfacecolor = '.75', markeredgecolor = 'k', marker = 'o', markevery = 32)
plt.show()
# create GeoDataFrame from df
df.reset_index(inplace=True)
df.rename(columns={'index': 'Y', 0: 'X'}, inplace=True)
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df['Y'], df['X']))
gdf.plot(linewidth = 3., color = 'k', markersize = 9) # working
gdf.plot(linewidth = 3., color = 'k', markersize = 9, markeredgecolor = 'k') # not working
plt.show()
2条答案
按热度按时间knpiaxh11#
您可能会对两个库都将方法命名为
.plot(
这一事实感到困惑。在matplotlib中,该方法专门转换为mpl.lines.Line2D
对象,该对象还包含标记及其样式。Geopandas,假设你想绘制地理数据,并使用路径(
mpl.collections.PathCollection
)。例如,它有面和边的颜色,但没有标记。只要你的路径闭合并形成一个多边形,面的颜色就起作用了(你的例子没有,使它“只是”一条线)。Geopandas似乎对点/标记使用了一点技巧,它似乎使用“CURVE 4”代码(三次贝塞尔曲线)绘制了一条“路径”。
如果捕捉geopandas返回的坐标轴,您就可以了解发生了什么:
使用
ax.get_children()
你会得到所有被添加到坐标轴的艺术家,因为这是一个简单的绘图,很容易看出PathCollection
是实际的数据。其他艺术家正在绘制坐标轴/脊线等。如果你减少了很多点的数量,比如用5而不是1024,检索路径的绘制显示坐标和代码使用:
有关这些路径如何工作的更多信息,请访问:
https://matplotlib.org/stable/tutorials/advanced/path_tutorial.html
长话短说,您确实拥有与使用Matplotlib时相同的所有关键字,但它们是Path的关键字,而不是您可能期望的Line 2D对象的关键字。
你可以随时改变顺序,从你创建的Matplotlib图形/轴开始,当你想绘制某个东西时,把这个轴传递给Geopandas。当你(也)想在同一个轴上绘制其他东西时,这可能会使它更容易或更直观。它可能需要更多的规则来确保(空间)坐标等匹配。
我个人几乎总是这样做,因为它允许使用相同的Matplotlib API来做大部分的绘图工作。无可否认,这可能有一个稍微陡峭的学习曲线。但总的来说,我发现它比不得不处理每个包的稍微不同的解释,使用Matplotlib的引擎盖(如geopandas,seborn,xarray等)更容易。但这真的取决于你来自哪里。
nxowjjhe2#
谢谢你的详细回答。基于此,我想出了这个简化的代码从我的真实的项目。
我有一个shapefile
shp
和一些要绘制的点数据df
。shp
使用geopandas绘制,df
使用matplotlib.pl绘制。无需像最初那样将点数据传输到地理数据框gdf
中。