Полярная диаграмма с вашим стилем и аннотациями
Этот 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
+1
2
+1
+1
+1