Найти в Дзене
10,3 тыс подписчиков

🖥 Как создать привлекательные графики с рейтингами стран с помощью Python и Matplotlib


Шаг 1: Создание рейтингов

На первом этапе необходимо упорядочить страны по каждому году в датасете, что легко сделать с помощью pandas.
def create_rankings(df, columns):
rank_columns = ["rank_{}".format(i) for i in range(len(columns))]
for i, column in enumerate(columns):
df[rank_columns[i]] = df[column].rank(ascending=False)

return df, rank_columns

Шаг 2: Создание и стилизация сетки

Теперь, когда мы подготовили данные, пришло время создать сетку, на которой мы можем рисовать наши линии и флажки.

set_style- функция Seaborn, которая создает общий стиль. Она определяет такие вещи, как цвет фона и семейство шрифтов. Я также удаляю корешки и галочки.

def set_style(font_family, background_color, grid_color, text_color):
sns.set_style({
"axes.facecolor": background_color,
"figure.facecolor": background_color,

"axes.grid": True,
"axes.axisbelow": True,

"grid.color": grid_color,

"text.color": text_color,
"font.family": font_family,

"xtick.bottom": False,
"xtick.top": False,
"ytick.left": False,
"ytick.right": False,

"axes.spines.left": False,
"axes.spines.bottom": False,
"axes.spines.right": False,
"axes.spines.top": False,
}
)

Я запускаю функцию со следующими значениями.
font_family = "PT Mono"
background_color = "#FAF0F1"
text_color = "#080520"
grid_color = "#E4C9C9"

set_style(font_family, background_color, grid_color, text_color)

Для создания сетки у меня есть функция, которая форматирует оси y и x. Она принимает несколько параметров, которые позволяют мне применять различные настройки, например, размер меток.
def format_ticks(ax, years, padx=0.25, pady=0.5, y_label_size=20, x_label_size=24):
ax.set(xlim=(-padx, len(years) -1 + padx), ylim=(-len(df) - pady, - pady))

xticks = [i for i in range(len(years))]
ax.set_xticks(ticks=xticks, labels=years)

yticks = [-i for i in range(1, len(df) + 1)]
ylabels = ["{}".format(i) for i in range(1, len(df) + 1)]
ax.set_yticks(ticks=yticks, labels=ylabels)

ax.tick_params("y",labelsize=y_label_size, pad=16)
ax.tick_params("x", labeltop=True, labelsize=x_label_size, pad=8)

Вот как это выглядит, когда я запускаю все, что у нас есть на данный момент.
# Load data
years = ["2000", "2005", "2010", "2015", "2020", "2022"]
df = pd.read_csv("rankings.csv", index_col=None)
df, rank_columns = create_rankings(df, years)

# Create chart
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(15, 1.6*len(df)))
format_ticks(ax, years)

📌 Код

2 минуты