#python-3.x #matplotlib #gis #shapefile
#python-3.x #matplotlib #гис #шейп-файл
Вопрос:
Я пытаюсь создать базовый график карты мира, используя Python и библиотеку Matplotlib. Однако, когда я строю полигоны, на графике отображается много прямых линий, которые, похоже, не являются частью многоугольника. Я относительно новичок в работе с шейп-файлами, но код, который я использую, работал с предыдущим шейп-файлом, который я использовал, поэтому я в замешательстве и задаюсь вопросом, чего может не хватать в коде.
Код, который я использую:
import numpy as np
import pandas as pd
import shapefile as shp
import matplotlib.pyplot as plt
import seaborn as sns
import os
sns.set(style='whitegrid', palette='ocean', color_codes=True)
sns.mpl.rc('figure', figsize=(10,6))
sf = shp.Reader(shp_path)
def plot_map(sf, x_lim = None, y_lim = None, figsize = (11,9)):
'''
Plot map with lim coordinates
'''
plt.figure(figsize = figsize)
id=0
for shape in sf.shapeRecords():
x = [i[0] for i in shape.shape.points[:]]
y = [i[1] for i in shape.shape.points[:]]
plt.plot(x, y, 'k')
if (x_lim == None) amp; (y_lim == None):
x0 = np.mean(x)
y0 = np.mean(y)
plt.text(x0, y0, id, fontsize=10)
id = id 1
if (x_lim != None) amp; (y_lim != None):
plt.xlim(x_lim)
plt.ylim(y_lim)
plot_map(sf)
plt.show()
По следующей ссылке показан результирующий график (мне еще не разрешено публиковать изображения?):
Любая помощь приветствуется, спасибо всем!
Ответ №1:
пожалуйста, используйте ‘k.’ или используйте scatter
вместо plot
import numpy as np
import pandas as pd
import shapefile as shp
import matplotlib.pyplot as plt
import seaborn as sns
import os
sns.set(style='whitegrid', palette='ocean', color_codes=True)
sns.mpl.rc('figure', figsize=(10,6))
sf = shp.Reader(shp_path)
def plot_map(sf, x_lim = None, y_lim = None, figsize = (11,9)):
'''
Plot map with lim coordinates
'''
plt.figure(figsize = figsize)
id=0
for shape in sf.shapeRecords():
x = [i[0] for i in shape.shape.points[:]]
y = [i[1] for i in shape.shape.points[:]]
## change here
plt.plot(x, y, 'k.')
if (x_lim == None) amp; (y_lim == None):
x0 = np.mean(x)
y0 = np.mean(y)
plt.text(x0, y0, id, fontsize=10)
id = id 1
if (x_lim != None) amp; (y_lim != None):
plt.xlim(x_lim)
plt.ylim(y_lim)
plot_map(sf)
plt.show()
Комментарии:
1. Спасибо за отзыв! С предлагаемым вами изменением карта действительно выглядит более аккуратно. Однако границы стран не «закрыты» прямой линией, что я и ищу, но остаются открытыми. Есть ли способ соединить каждую точку данных разброса с линией без получения моей предыдущей ошибки?