2017-01-05 4 views
2

Я пытаюсь заполнить многоугольники каким-то рисунком вместо цвета (из-за того, что я должен распечатать проект B & W). До сих пор мне удалось заполнить только оттенки серого, но я хотел бы использовать шаблонный подход, если есть способ сделать это.Заполните многоугольник с рисунком вместо цвета Geopandas

Кусок моего кода заключается в следующем:

if info['max']=='catarro': 
    poly = Polygon(shape, facecolor = "#DDDDDD", alpha = alpha, linewidtt = 0.01) 
    plt.gca().add_patch(poly) 

Это, если утверждение внутри для цикла, которая пробегает информацию и форму. Если какой-то факт информации совпадает со строкой, я просто окрашиваю поли и добавляю его как патч поверх шейп-файла.

Я также хотел бы добавить этот узор в легенду.

Заранее благодарен.

ответ

2

Недавнего обязательство geopandas позволяет пропускание hatch аргумента методу plot на GeoDataFrame, так что если вы установили из последнего источника, и у вас есть GeoDataFrame имя gdf, вы можете сделать:

gdf.plot(facecolor="#DDDDDD", hatch="//") 

Затем вы можете построить любое подмножество, которое вы хотите, на основе соответствия некоторого атрибута. Это немного непонятно мне из вашего примера, как ваши данные структурированы, но что-то вроде:

gdf[gdf["key"] == value1].plot(facecolor="#DDDDDD", hatch="//") 
gdf[gdf["key"] == value2].plot(facecolor="#DDDDDD", hatch="o") 

и так далее.

Последние geopandas, доступные на заказ или конда, не имеют этой функции. Вы все еще можете передать hatch ключевое слово в matplotlib.patches.Polygon (который, кажется, что вы используете в вашем примере), чтобы контролировать стиль, который будет в вашем примере выше просто быть:

poly = Polygon(shape, facecolor="#DDDDDD", alpha=alpha, linewidth=0.01, hatch="\\") 

Более подробное демо планировавших люков доступный в matplotlib gallery.

Чтобы добавить легенду, вы можете сохранить список построенных полигонов и связанных меток, а затем передать их legend. Таким образом, внутри цикла выше, что-то вроде:

polys.append(poly) 
labels.append(search_str) 

А потом, за пределами вашего цикла:

ax.legend(polys, labels) 
+0

Большое спасибо! –