Полярная диаграмма с вашим стилем и аннотациями

Этот Python-код создает полярную гистограмму с помощью библиотеки Matplotlib для визуализации данных об изучающих испанский язык в разных странах и их родном испаноязычном населении.

Библиотеки

Для создания этого графика нам понадобится целая куча библиотек!

import matplotlib as mpl
import matplotlib.pyplot as plt # plotting the chart
from matplotlib.cm import ScalarMappable # creating scalar mappable objects for color mapping
from matplotlib.lines import Line2D # creating custom lines
import matplotlib.patches as mpatches # customize graphical shapes and patches
from matplotlib.patches import Patch
from textwrap import wrap # countries name lisibility

import numpy as np # arrays and mathematical functions
import pandas as pd # data manipulation
from mpl_toolkits.axes_grid1.inset_locator import inset_axes # adding inset axes within a larger plot

Набор данных

Доступ к данным можно получить по указанному ниже адресу.

url = 'https://raw.githubusercontent.com/holtzy/The-Python-Graph-Gallery/master/static/data/polar_data.csv'

# Remove the first one when merging
df = pd.read_csv('../../static/data/polar_data.csv')
#df = pd.read_csv(url)

Создайте переменные для графика

Чтобы сделать код более понятным, мы сначала создаем первый фрагмент кода, содержащий определения переменных, которые используются в дальнейшем при настройке графа.

  • Мы указываем, что хотим использовать шрифт Times и что цвет текста – “#1f1f1f”.
  • Мы определяем пользовательскую цветовую карту (cmap), используя список значений цветов. Эта карта цветов будет использоваться для сопоставления значений с цветами в нашем графике.
  • Мы также создаем нормализатор для привязки значений данных к диапазону [0, 1], который соответствует цветам в нашей cmap. В данном случае мы используем значения ‘Cont_code’ из df для определения диапазона отображения цветов
# Set default font to Bell MT, Bell is the prettiest serif IMO
plt.rcParams.update({"font.family": "Times"})

# Set default font color to GREY12
plt.rcParams["text.color"] = "#1f1f1f"

# The minus glyph is not available in Bell MT
# This disables it, and uses a hyphen
plt.rc("axes", unicode_minus=False)

# Colors
COLORS = ['#914F76','#A2B9B6','tan','#4D6A67','#F9A03F','#5B2E48','#2B3B39']
cmap = mpl.colors.LinearSegmentedColormap.from_list("my color", COLORS, N=7)

# Normalizer
NUMBERS = df['Cont_code'].values
norm = mpl.colors.Normalize(vmin= NUMBERS.min(), vmax= NUMBERS.max())
COLORS = cmap(norm(NUMBERS))

Создание диаграммы

График отображается в полярных координатах, то есть это круговая диаграмма с полосами, простирающимися радиально от центра.

  • Она создает полярный график с белым фоном и настраивает некоторые свойства графика, такие как смещение угла, масштаб оси y и метки.
  • Он добавляет столбики, представляющие количество изучающих испанский язык в разных странах, где угол каждого столбика соответствует положению страны на окружности.
  • В качестве ориентиров добавляются пунктирные вертикальные линии.
  • Добавляются точки, обозначающие средний прирост носителей испанского языка в этих странах.
  • Названия стран обернуты для лучшей читаемости, а метки регионов расположены на оси x.
  • На график добавлены заголовки, шкала и информация о кредитах/источниках.
  • Наконец, включена легенда, объясняющая цветовое кодирование, используемое в диаграмме
# Инициализируйте макет в полярных координатах
fig, ax = plt.subplots(figsize=(7, 12.6), subplot_kw={"projection": "polar"})

# Установите белый цвет фона для оси и фигуры.
fig.patch.set_facecolor("white")
ax.set_facecolor("white")

ax.set_theta_offset(1.2 * np.pi / 2)
ax.set_ylim(0, 45000000)
ax.set_yscale('symlog', linthresh=500000)

#Добавить решетку
ANGLES = np.linspace(0.05, 2*np.pi - 0.05, len(df), endpoint = False)
LENGTHS = df['Students'].values
ax.bar(ANGLES, LENGTHS,
       color=COLORS, alpha=0.5,
       width=0.3, zorder=11,
       label='Spanish Learners')

# Добавьте пунктирные вертикальные линии. Это просто ссылки
ax.vlines(ANGLES, 0, 45000000, color="#1f1f1f", ls=(0, (4, 4)), zorder=11)

# Добавьте точки для обозначения среднего коэффициента усиления
MEAN_GAIN = df['Natives'].values
ax.scatter(ANGLES, MEAN_GAIN, s=80, color= COLORS, zorder=11, label = 'Native Spanish Speakers')

# Добавьте метки для регионов
REGION = ["\n".join(wrap(r, 5, break_long_words=False)) for r in df['Country'].values]

# Установите ярлыки
ax.set_xticks(ANGLES)
ax.set_xticklabels(REGION, size=12)
ax.set_yticks(np.arange(0,45000000,
                        step=5000000))

# Добавьте заголовок и подстиль в верхней части графика
plt.suptitle('Top Countries with Spanish Learners',
             size = 20, y = 0.95)
plt.title('And their Native Spanish Speaking Population',
          style = 'italic', size = 14, pad = 85)

# Добавьте шкалу, начиная с 1M и заканчивая 45M
PAD = 10
ax.text(-0.75 * np.pi / 2, 1000000 + PAD, "1M", ha="right", size=12)
ax.text(-0.75 * np.pi / 2, 5000000 + PAD, "5M", ha="right", size=11)
ax.text(-0.75 * np.pi / 2, 10000000 + PAD, "10M", ha="right", size=10)
ax.text(-0.75 * np.pi / 2, 20000000 + PAD, "20M ", ha="right", size=9)
ax.text(-0.75 * np.pi / 2, 30000000 + PAD, "30M ", ha="right", size=8)
ax.text(-0.75 * np.pi / 2, 46000000 + PAD, "45M ", ha="right", size=7)
XTICKS = ax.xaxis.get_major_ticks()
for tick in XTICKS:
    tick.set_pad(12)

# Добавьте кредиты и источники
caption = "\n".join(["Created adapting a tutorial from Yan Holtz: https://python-graph-gallery.com/web-circular-barplot-with-matplotlib/",
                     "Data compiled from various sources including:",
                     "https://www.statista.com/statistics/991020/number-native-spanish-speakers-country-worldwide/",
                     "https://cvc.cervantes.es/lengua/espanol_lengua_viva/pdf/espanol_lengua_viva_2022.pdf",
                     "https://www.wordspath.com/spanish-speaking-countries-in-europe/#:~:text=More%20than%2084%20million%20people,them%20are%20native%20Spanish%20speakers."
])
fig.text(0, 0.1, caption, fontsize=10, ha="left", va="baseline")

# Сначала освободите место для легенды и надписи в нижней части.
fig.subplots_adjust(bottom=0.175)

# Добавьте пользовательскую легенду
legend_elements = [Line2D([0], [0], marker='o', color='w', label='Native Spanish Speaking Population',
                          markerfacecolor='gray', markersize=12),
                          Line2D([0],[0] ,color = 'lightgray', lw = 3, label = 'Spanish Learners'),
                          mpatches.Patch(color='tan', label='North America', alpha = 0.8),
                          mpatches.Patch(color='#F9A03F', label='South America', alpha = 0.8),
                          mpatches.Patch(color='#2B3B39', label='West Europe', alpha = 0.8),
                          mpatches.Patch(color='#914F76', label='West Africa', alpha = 0.8),
                          mpatches.Patch(color='#914F76', label='Central Africa', alpha = 0.8),
                          mpatches.Patch(color='#4D6A67', label='North Europe', alpha = 0.8),
                          mpatches.Patch(color='#A2B9B6', label='East Europe', alpha = 0.8)]
ax.legend(handles=legend_elements,
          loc='upper right', # location
          bbox_to_anchor=(1.4, 1), # shift the legend
          fontsize = 'small')

# Отобразите итоговый график
plt.show()
Полярная диаграмма с вашим стилем и аннотациями
+1
0
+1
2
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *