Проблема с полями вокруг карты в геопандах - PullRequest
1 голос
/ 05 июля 2019

Я не могу решить какую-то проблему с полем / местоположением между картой GeoPandas и добавленными аннотациями. Аннотации добавляются функциями addChartSignature и addTitle, и они вызывают ужасное расположение.

Мне удалось решить проблему с вертикальными полями с помощью хака, см. Комментарий ### to deal with vertical margin issue, однако я не могу разобраться с полем с левой стороны: хотелось бы, чтобы карта, подпись и заголовок были выровнены с левой стороны с очень небольшим запасом (как с правой стороны).

Я добавил переменную righthspace для правильного перемещения аннотаций, но это не помогает, и в любом случае это не так.

enter image description here

Ниже приведен пример кода, который обобщает проблему

from __future__ import division

import matplotlib.pyplot as plt
import geopandas
from mpl_toolkits.axes_grid1 import make_axes_locatable

def addChartSignature(ax, vspace=0, righthspace=0):

    ax.annotate('', 
                xy=(0.97, 0.05 + vspace), 
                xycoords='figure fraction',
                xytext=(0.03 + righthspace,0.05 + vspace), 
                textcoords='figure fraction',
                arrowprops=dict(arrowstyle="-",
                                linewidth=0.7,
                                facecolor='grey', 
                                alpha=.7, 
                                edgecolor='grey'),
                horizontalalignment = 'center', 
                verticalalignment='bottom')

    ax.annotate(u" ©myCompany", 
                 xy=(0.5, 0.5), 
                 xycoords='figure fraction',
                 xytext= (0.03 + righthspace,0.01+vspace), 
                 textcoords='figure fraction',
                 ha="left", 
                 va="bottom", 
                 color = 'grey', 
                 alpha = .7, 
                 fontsize = 11)

    ax.annotate(u"Source: Internal", 
                 xy=(0.5, 0.5), 
                 xycoords='figure fraction',
                 xytext=(0.97,0.01+vspace), 
                 textcoords='figure fraction',
                 ha="right", 
                 va="bottom", 
                 color = 'grey', 
                 alpha = .7, 
                 fontsize = 11)

def addTitle(ax, vspace=0, righthspace=0):
    ax.annotate("My Chart Title", 
                 xy=(0.5, 0.5), 
                 xycoords='figure fraction',
                 xytext=(0.01+righthspace, 0.985+vspace), 
                 textcoords='figure fraction',
                 ha="left", 
                 va="top", 
                 color = 'black', 
                 alpha = .75, 
                 fontsize = 19, 
                 weight = 'bold')

path = geopandas.datasets.get_path('naturalearth_lowres')
world = geopandas.read_file(path)
world = world[(world.pop_est>0) & (world.name!="Antarctica")]    

plt.style.use('fivethirtyeight')
fig = plt.figure(figsize=(8, 6))
ax = fig.add_axes([0., 0., 1, 1])

ax = world.plot(color="lightgrey", ax=ax)
divider = make_axes_locatable(ax)
cax = divider.append_axes('right',  size="3%", pad=-1.3) 
world.dropna().plot(
        column='pop_est', 
        ax=ax, 
        legend=True, 
        cax=cax, 
        cmap='RdYlGn',
        )

ax.grid(color='#F8F8F8')
ax.set_xticklabels([])
ax.set_yticklabels([])

### to deal with vertical margin issue
ax.set_aspect(aspect=4./3)
ax.margins(0)
ax.apply_aspect()
bbox = ax.get_window_extent().inverse_transformed(fig.transFigure)
w,h = fig.get_size_inches()
fig.set_size_inches(w*bbox.width, h*bbox.height)

addChartSignature(ax, righthspace = 0.05)
addTitle(ax, righthspace = 0.05)
...