Поэтому, когда я запускаю свой сценарий, легенда появляется немного за пределами окна, и я не уверен, как заставить окно включать все это. Я действительно не хочу масштабировать box.width моей диаграммы, больше, чем я уже сделал. Я также не уверен, почему легенда использует один и тот же цвет для каждого игрока, в отличие от цветовой карты, которую он использовал для построения точечных точек?

Код:

    from bs4 import BeautifulSoup
    import requests
    import pandas as pd
    import matplotlib.pyplot as plt
    import numpy as np

    # scrape total stats
    url = 'https://www.basketball-reference.com/leagues/NBA_2020_totals.html#totals_stats::pts'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    stats = soup.find_all('table')

    # convert table to dataframe
    data = pd.read_html(str(stats))
    df = pd.DataFrame(data[0])
    df['PTS'] = pd.to_numeric(df['PTS'], errors='coerce')
    df_sorted = df.sort_values(by=['PTS'], ascending=False)
    print(df_sorted[0:25])

    # data needed from dataframe
    points = df_sorted[0:25]['PTS']
    players = df_sorted[0:25]['Player']
    two_pts = df_sorted[0:25]['2P']
    three_pts = df_sorted[0:25]['3P']

    # visualise data
    fig, ax = plt.subplots()

    cmap = plt.get_cmap('tab20b')
    numDots = len(players)
    dotColors = cmap(np.linspace(0., 1., numDots))

    area = [10*n for n in range(len(points))]
    for x,y,s in zip(two_pts, three_pts, area):
        ax.scatter(two_pts, three_pts, s=area, c=dotColors)

    chartBox = ax.get_position()
    ax.set_position([chartBox.x0, chartBox.y0, chartBox.width*0.8, chartBox.height])

    # chart
    plt.gca().invert_xaxis()
    plt.gca().invert_yaxis()

    ax.legend(players, loc=5, bbox_to_anchor=(1.6, .5), fontsize=9)

    fig.tight_layout()

    plt.title('Basketball Stats')
    plt.show()
0
kr419 30 Окт 2019 в 19:18

1 ответ

Вы можете лучше разобраться с расположением легенды, если укажите размер фигуры. Добавив это в определение вашего изображения и удалив tight_layout():

fig, ax = plt.subplots(figsize=(20,10))

И используя

plt.legend(loc=5, bbox_to_anchor=(1.2, .5), fontsize=9)

Получаю вывод:

enter image description here

0
Francisca Concha-Ramírez 30 Окт 2019 в 20:24