Можно ли изменить цвет объекта в картопе после того, как он был добавлен? - PullRequest
0 голосов
/ 18 ноября 2018

Задача

Я использую cartopy, чтобы нарисовать некоторые страны в Python. Для этой цели я использую функцию add_geometry следующим образом:

geo = ax.add_geometries(geometry,facecolor='ghostwhite', edgecolor='black',crs=data_transf)

Я хочу иметь возможность изменять цвет геометрического объекта, который я добавил. Таким образом, я мог бы делать анимацию со странами, меняющими цвет, не перерисовывая все каждый кадр Например, все страны начинают с белого цвета, а затем становятся синими одна за другой.

Однако я не могу найти способ изменить цвет объекта после его добавления.

Что обычно работает

С обычным сюжетом в maplotlib я бы сделал:

import matplolib.pyplot as plt

line, = plt.plot([1,2,3],[4,5,6],'red') #Plot in red
line.set_color('green') #Change the color to green

Почему это не работает здесь

Для FeatureArtist с cartopy не добавлена ​​функция set_color, добавленная с add_geometries. Фактически, кажется, что свойства color, facecolor, ... даже не существуют для FeatureArtist, как показывает вызов matplotlib.artist.getp.

Для сюжета, вызов возвращает:

>>import matplotlib.artist as mart
>>mart.getp(line)
agg_filter = None
alpha = None
animated = False
antialiased = True
children = []
clip_box = TransformedBbox(     Bbox(x0=0.0, y0=0.0, x1=1.0, ...
clip_on = True
clip_path = None
color = (1.0, 0.0, 0.0, 1.0)
contains = None
dash_capstyle = butt
dash_joinstyle = round
data = (array([1, 2, 3]), array([4, 5, 6]))
drawstyle = default
figure = Figure(640x476)
fillstyle = full
gid = None
in_layout = True
label = _line0
linestyle = -
linewidth = 1.5
marker = None
markeredgecolor = (1.0, 0.0, 0.0, 1.0)
markeredgewidth = 1.0
markerfacecolor = (1.0, 0.0, 0.0, 1.0)
markerfacecoloralt = none
markersize = 6.0
markevery = None
path = Path(array([[ 1.,  4.],        [ 2.,  5.],        ...
path_effects = []
picker = None
pickradius = 5
rasterized = None
sketch_params = None
snap = None
solid_capstyle = projecting
solid_joinstyle = round
transform = CompositeGenericTransform(     TransformWrapper(  ...
transformed_clip_path_and_affine = (None, None)
url = None
visible = True
xdata = [1 2 3]
xydata = [[ 1.  4.]  [ 2.  5.]  [ 3.  6.]]
ydata = [4 5 6]
zorder = 2

А для геометрии:

>>mart.getp(geo)
agg_filter = None
alpha = None
animated = False
children = []
clip_box = TransformedBbox(     Bbox(x0=0.0, y0=0.0, x1=1.0, ...
clip_on = True
clip_path = None
contains = None
figure = Figure(1200x990)
gid = None
in_layout = True
label = 
path_effects = []
picker = None
rasterized = None
sketch_params = None
snap = None
transform = CompositeGenericTransform(     TransformWrapper(  ...
transformed_clip_path_and_affine = (None, None)
url = None
visible = True
zorder = 1

Как видите, нет свойства color (или подобного), которое я мог бы изменить.

1 Ответ

0 голосов
/ 29 ноября 2018

Это определенно не хватает в интерфейсе Cartopy. Не могли бы вы открыть вопрос о трекере Cartopy ?

В качестве обходного пути вы можете изменить приватный атрибут _kwargs, который, кажется, работает:

import cartopy.feature as cfeature
f = ax.add_feature(cfeature.STATES)
f._kwargs['edgecolor'] = 'blue'

ПРИМЕЧАНИЕ: Используется закрытый API, поэтому он может изменяться / прерываться без предупреждения. Это просто обходной путь, чтобы заставить вас двигаться, но я настоятельно рекомендую вам сообщить о проблеме, чтобы в Cartopy было добавлено правильное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...