我是python的新手,所以我希望我的问题的答案相对简单.
我正在尝试使用geopandas制作一个等值线图.但是,由于我正在制作需要相互比较的多个地图,因此使用自定义数据分类方案(而不是分位数或jenks)是必不可少的.因此,我一直在尝试使用User_Defined方案,我能够创建垃圾箱,但我不知道如何将它们应用到地图本身.
这就是我创建分类方案时所做的:
import pysal.esda.mapclassify as ps from pysal.esda.mapclassify import User_Defined bins = [5, 20, 100, 600, 1000, 3000, 5000, 10000, 20000, 400000] ud = User_Defined(projected_world_exports['Value'], bins)
(其中'Value'是我在地图中绘制的列)
然后,当我尝试绘制等值线图时,我不知道该方案的意图是什么
projected_world_exports.plot(column='Value', cmap='Greens', scheme = ?????)
如果有人可以提供帮助,我将非常感激!
谢谢x
我看了一下geopandas绘图函数的代码(https://github.com/geopandas/geopandas/blob/master/geopandas/plotting.py),但我想这个plot
方法只接受三个名称中的一个("分位数") ,"equal_interval","fisher_jenks")但不是直接的箱子列表或pysal.esda.mapclassify
分类器如User_Defined
.
(我想这可能与该问题,其中最后一个注释是如何定义"用户自定义"分档为API).
但是现在我想你可以通过稍微修改和重用我链接的文件中的函数来实现这一点.例如,您可以plot_dataframe
像这样重写您自己的版本:
import numpy as np def plot_dataframe(s, column, binning, cmap, linewidth=1.0, figsize=None, **color_kwds): import matplotlib.pyplot as plt values = s[column] values = np.array(binning.yb) fig, ax = plt.subplots(figsize=figsize) ax.set_aspect('equal') mn = values.min() mx = values.max() poly_idx = np.array( (s.geometry.type == 'Polygon') | (s.geometry.type == 'MultiPolygon')) polys = s.geometry[poly_idx] if not polys.empty: plot_polygon_collection(ax, polys, values[poly_idx], True, vmin=mn, vmax=mx, cmap=cmap, linewidth=linewidth, **color_kwds) plt.draw() return ax
然后你需要通过复制它们来定义函数_flatten_multi_geoms和plot_polygon_collection,你就可以像这样使用它了:
bins = [5, 20, 100, 600, 1000, 3000, 5000, 10000, 20000, 400000] ud = User_Defined(projected_world_exports['Value'], bins) plot_dataframe(projected_world_exports, 'Value', ud, 'Greens')
这是另一种不需要修改geopandas代码的方法。它涉及到首先为垃圾箱添加标签,以便您可以创建自定义颜色图,以将每个垃圾箱标签映射到特定颜色。然后必须在您的地理数据框中创建一列,以指定将哪个bin标签应用于该地理数据框中的每一行,然后使用该列使用自定义颜色图来绘制choropleth。
from matplotlib.colors import LinearSegmentedColormap bins = [5, 20, 100, 600, 1000, 3000, 5000, 10000, 20000, 400000] # Maps values to a bin. # The mapped values must start at 0 and end at 1. def bin_mapping(x): for idx, bound in enumerate(bins): if x < bound: return idx / (len(bins) - 1.0) # Create the list of bin labels and the list of colors # corresponding to each bin bin_labels = [idx / (len(bins) - 1.0) for idx in range(len(bins))] color_list = ['#edf8fb', '#b2e2e2', '#66c2a4', '#2ca25f', '#006d2c', \ '#fef0d9', '#fdcc8a', '#fc8d59', '#e34a33', '#b30000'] # Create the custom color map cmap = LinearSegmentedColormap.from_list('mycmap', [(lbl, color) for lbl, color in zip(bin_labels, color_list)]) projected_world_exports['Bin_Lbl'] = projected_world_exports['Value'].apply(bin_mapping) projected_world_exports.plot(column='Bin_Lbl', cmap=cmap, alpha=1, vmin=0, vmax=1)