Как избавиться от лишних строк в графике шейп-файла Python?

#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. Спасибо за отзыв! С предлагаемым вами изменением карта действительно выглядит более аккуратно. Однако границы стран не «закрыты» прямой линией, что я и ищу, но остаются открытыми. Есть ли способ соединить каждую точку данных разброса с линией без получения моей предыдущей ошибки?