Эффективное управление несколькими линейными графиками (45 уникальных строк)

#python #data-visualization #linegraph

#python #визуализация данных #linegraph

Вопрос:

моя групповая задача Я пытаюсь визуализировать с помощью линейного графика производство продуктов питания в африканских странах (45 из моих данных) за 10 лет. После использования функции groupby и unstack график получается хорошим, но не читаемым, а цвет, позволяющий различать каждую строку, оставляет желать лучшего. Из визуализации моего лектора он использовал Wolfram.

Как я могу достичь этого с помощью Python или есть лучшие альтернативы моему подходу?

Вот мой код

 #To make the legend readable we reduce the font size
from matplotlib.font_manager import FontProperties
fontP = FontProperties()
fontP.set_size('small')
fig, ax = plt.subplots(figsize = (20,16))


df1.groupby(['Year','Country',]).sum().unstack().plot(ax = ax)
ax.set_yscale("log")
ax.set_ylim(1,300000)

plt.ylabel('Year')
plt.xlabel('Total Value')
plt.title('Food Production in Africa over the Years')
plt.legend(title='Countries', bbox_to_anchor=(1.05, 1), loc='upper left', 
     prop=fontP)
  

Визуализация моего лектора с использованием Wolfram

введите описание изображения здесь

Моя попытка

введите описание изображения здесь

Комментарии:

1. Добро пожаловать в Stackoverflow. Ваша попытка хороша. Вы должны опубликовать свой код python также выше, чтобы пользователи здесь могли давать предложения. Или вы спрашиваете о других графических альтернативах, которые можно использовать с этими данными?

Ответ №1:

Поскольку данные были недоступны, я псевдосоздал тенденции численности населения для каждой страны в Африке на основе самых последних данных, а затем использовал ax.text(x,y,country) для создания данных. В ваших данных не так много места, поэтому я думаю, что это применимо. Этот пример взят из официальной ссылки.

 import pandas as pd
import numpy as np

df = pd.read_csv('./africa_t.csv', sep=',')
  

введите описание изображения здесь

 import matplotlib.pyplot as plt

fig, ax = plt.subplots(1, 1, figsize=(12, 14))

# These are the colors that will be used in the plot
ax.set_prop_cycle(color=[
    '#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c', '#98df8a',
    '#d62728', '#ff9896', '#9467bd', '#c5b0d5', '#8c564b', '#c49c94',
    '#e377c2', '#f7b6d2', '#7f7f7f', '#c7c7c7', '#bcbd22', '#dbdb8d',
    '#17becf', '#9edae5'])

ax.spines['top'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)

ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()

fig.subplots_adjust(left=.06, right=.75, bottom=.02, top=.94)

ax.set_xticks(range(2011, 2020, 10))
ax.set_yticks(range(5000, 210000000, 5000000))
ax.xaxis.set_major_formatter('{x:.0f}')

ax.grid(True, 'major', 'y', ls='--', lw=.5, c='k', alpha=.3)

ax.tick_params(axis='both', which='both', labelsize=14,
               bottom=False, top=False, labelbottom=True,
               left=False, right=False, labelleft=True)

country = df.columns

for column in country:
    line, = ax.plot(df['Year'].to_list(), df[column].to_list(), lw=2.5)
    y_pos = df[column].to_list()[-1] - 0.5
    ax.text(2020.5, y_pos, column, fontsize=14, color=line.get_color())

plt.show()
  

введите описание изображения здесь

Комментарии:

1. Большое вам спасибо, я так благодарен.

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

3. Я использовал функцию groupby в своем коде, как мне интегрировать цикл, пожалуйста, помогите

4. Результирующие сгруппированные фреймы данных будут отображены в циклическом процессе. Форма результирующих сгруппированных данных должна соответствовать форме изображения данных, которые я вставил. Строки — это годы, а столбцы — данные по странам.