Построение в цикле (с базовой картой и pyplot) .... проблемы с pyplot.clf () - PullRequest
1 голос
/ 11 августа 2010

Я строю некоторые данные о погоде для исследовательского проекта.Сюжет состоит из 18 временных шагов.Я решил, что лучший способ сделать это - создать новый график для каждого временного шага, сохранить его в файл и создать новый график для следующего временного шага (используя цикл for).

Например:


map_init  #[Basemap Instance]
extra_shapes  #[Basemap.readshapefile object]

for i in range(timesteps):
    #plot the weather data for current timestep to current plot
    map_init.imshow(data[i])

    # extra_shapes are county boundaries.  Plot those as polygons
    pyplot.Polygon(map_init.extra_shapes[i])

    # Plot the state boundaries (in basemap)
    map_init.drawstates()

    # add a colorbar
    pyplot.colorbar()

    # Save the figure
    pyplot.savefig(filepath)

    #close figure and loop again (if necessary)
    pyplot.clf()

Проблема заключается в pyplot.clf()

Код работает, кроме одной вещи.Только первый сюжет выходит как положено.На каждом последующем участке отсутствует extra_shapes (т.е. нет границ округа).Я не понимаю связи между наличием pyplot.clf() и ошибкой pyplot.Polygon()?

Если удалить, extra_shapes строится, но тогда каждый график имеет несколько цветовых полос (в зависимости от значения i).Единственная причина pyplot.clf() заключается в том, чтобы на конечном графике не было 18 цветовых полос.Есть ли способ заставить один и только один цветовой барьер на график?

1 Ответ

3 голосов
/ 11 августа 2010

Попробуйте создать новую фигуру вместо использования clf ().

например,

for i in range(timesteps):
    fig = pyplot.figure()
    ...
    fig.savefig(filepath)

В качестве альтернативы (и быстрее) вы можете просто обновить данные в объекте изображения (возвращаемом imshow).()).

например, что-то вроде (полностью не проверено):

map_init  #[Basemap Instance]
extra_shapes  #[Basemap.readshapefile object]


#plot the weather data for current timestep to current plot
img = map_init.imshow(data[0])

# extra_shapes are county boundaries.  Plot those as polygons
plygn = pyplot.Polygon(map_init.extra_shapes[0])

# Plot the state boundaries (in basemap)
map_init.drawstates()

# add a colorbar
pyplot.colorbar()

for i in range(timestamps):
    img.set_data(data[i])
    plygn.set_xy(map_init.extra_shapes[i])
    pyplot.draw()
    pyplot.savefig(filepath)

Однако есть вероятность, что этот метод может плохо работать с базовой картой.Возможно, я также неправильно помню правильный способ перерисовать фигуру, но я вполне уверен, что это просто plt.draw () ...

Надеюсь, что это все равно немного поможет

Редактировать: Простозаметил, что вы также рисуете свои полигоны внутри цикла.Обновлен второй пример, чтобы правильно отразить это.

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