Страница 1 из 1

Python. Geopandas. Colormap

Добавлено: 20 окт 2017, 10:56
jerry-maori
Вопрос такой - можно ли для geopandas.plot() указать, каким цветом красить каждый полигон в зависиомти от значения.
т.е. задать прям палитру самому.
Нечто типа dict:

Код: Выделить всё

colors = {'High-High':'red', 'Low-High':'bright blue', 'Low-Low':'royal blue', 'High-Low':'orange','Non significant':'grey'}
Рисую локальную автокорреляцию (Local Moran I)
есть geodataframe с территориями, значениями и прочим.
а вот на colormap как-то подвис.

Заранее спасибо!

Re: Python. GEopandas. Colormap

Добавлено: 20 окт 2017, 13:03
Andrey Zhukov
Ооо, это нетривиальная задача. Предсказуемости можно добавить с помощью прибитого гвоздями бининга, но вот ручками каждый класс красить не дадут. Для этого придется альтернативные подходы использовать. Например, делать визуалку через folium.

С другой стороны, в EDA момент с окраской в большинстве случаев не имеет значения.
Во, можно поиграться с кастомным colormap: https://matplotlib.org/examples/pylab_e ... _cmap.html

Re: Python. GEopandas. Colormap

Добавлено: 20 окт 2017, 13:25
jerry-maori
Folium - не нравится :( Походит на строительство атомной станции ради одной лампочки
Предсказуемости можно добавить с помощью прибитого гвоздями бининга, но вот ручками каждый класс красить не дадут.
Так, классы у меня всегда одни и те же. И называются всегда одинаково.
Можно подробнее про бининг ? Хотя бы на какие слова гуглить?

Re: Python. GEopandas. Colormap

Добавлено: 21 окт 2017, 18:15
jerry-maori
Задача получила своё решение, правда в слегка экзотическом стиле
Правда, проблема по сути никуда не ушла. Я вот теперь думаю, а как, допустим, полигон заштриховать....

Код: Выделить всё

import pysal as ps
import pandas as pd
import numpy as np
import geopandas as gpd

from matplotlib import pyplot as plt
from matplotlib.patches import Polygon
from matplotlib.lines import Line2D
from matplotlib.collections import PatchCollection

Код: Выделить всё


type_line=['High-High','Low-High','Low-Low','High-Low','NS']
type_color= ['#252525','#969696','#cccccc', '#636363','#f7f7f7']

fig=plt.figure()
ax = plt.subplot(2,3,CPOS)
    ax.set_title('Local Moran`s I\n' +  w)
    
    for t,c in zip(type_line,type_color):
        block=shape[shape.LISA_QUAD==t]
        bx=[]
        for cc in range(0,block.shape[0]):
            poly=block[:].iloc[cc]
            poly=poly['geometry']
            x,y = poly.exterior.xy
            dst=np.vstack([x,y])
            dst=np.transpose(dst)
            bx.append(Polygon(dst, True))
        bx = PatchCollection(bx,label=t,edgecolor='black',color=c,linewidth=0.5)    
        ax.add_collection(bx)
    
    circ1 = Line2D([0], [0], linestyle='', marker='s', markersize=15, markerfacecolor=type_color[0])
    circ2 = Line2D([0], [0], linestyle='', marker='s', markersize=15, markerfacecolor=type_color[1])
    circ3 = Line2D([0], [0], linestyle='', marker='s', markersize=15, markerfacecolor=type_color[2])
    circ4 = Line2D([0], [0], linestyle='', marker='s', markersize=15, markerfacecolor=type_color[3])
    circ5 = Line2D([0], [0], linestyle='', marker='s', markersize=15, markerfacecolor=type_color[4])
        
    ax.legend((circ1, circ2, circ3,circ4,circ5), (type_line[0],type_line[1],type_line[2],type_line[3],type_line[4]), numpoints=1, loc='lower right')
    
    ax.set_axis_off()
    plt.axis('equal')

Re: Python. Geopandas. Colormap

Добавлено: 21 окт 2017, 18:38
Александр Мурый
Попытался ради интереса выполнить это в IPython, а там такое:
NameError: name 'CPOS' is not defined

Re: Python. Geopandas. Colormap

Добавлено: 21 окт 2017, 18:47
jerry-maori
Это просто куски, чтобы было ясно, что именно делается.
т.е. не полный код -- оттого и не работает.