python
MydaysAnonymous
python
02/16/2026 7:52 PM
5.9 KB
11
Indexable
from datetime import date
import random
import string
import os
import matplotlib.pyplot as plt
# --- даты и проценты ---
today = date.today()
d1 = date(1984, 4, 24)
d2 = date(2020, 2, 21)
diff1 = abs((today - d1).days)
diff2 = abs((today - d2).days)
total = diff1 + diff2 if (diff1 + diff2) != 0 else 1
pct1 = diff1 / total * 100
pct2 = diff2 / total * 100
# --- стиль и цвета для тёмной темы ---
plt.style.use("dark_background")
plt.rcParams.update({
"axes.edgecolor": "#444444",
"axes.facecolor": "#222222",
"figure.facecolor": "#121212",
"font.size": 10,
"font.weight": "regular",
"text.color": "#e6e6e6",
"axes.labelcolor": "#e6e6e6",
"xtick.color": "#608bec",
"ytick.color": "#cfcfcf"
})
colors = ["#0078ff", "#ff6600"]
explode = (0.02, 0.02)
sizes = [diff1, diff2]
# --- создаём фигуру ---
fig, ax = plt.subplots(figsize=(7, 5))
# внешний (тонкий) пирог для процентов
wedges_outer, texts_outer, autotexts_outer = ax.pie(
sizes,
colors=colors,
startangle=90,
counterclock=False,
radius=1.0,
wedgeprops=dict(width=0.36, edgecolor="#eeeeee", linewidth=1.2),
explode=explode,
autopct=lambda pct: f"{pct:.1f}%" if pct > 0 else "",
pctdistance=0.78,
textprops=dict(fontweight="bold", fontsize=10, color="#e6e6e6")
)
# центральное "кольцо"
centre_circle = plt.Circle((0, 0), 0.64, fc=plt.rcParams["figure.facecolor"], linewidth=0, edgecolor="none")
ax.add_artist(centre_circle)
for w in wedges_outer:
w.set_linewidth(1)
w.set_edgecolor("#0f0f0f")
# Текст в центре пирога
ax.text(0, 0, f"{pct1:.2f}%\nvs\n{pct2:.2f}%", ha="center", va="center", fontsize=11, weight="semibold", color="#f2f2f2")
# Форматированные строки: короткий русский формат и формат с точками
months_ru = {
1: "янв.", 2: "февр.", 3: "март", 4: "апр.", 5: "мая", 6: "июн.",
7: "июл.", 8: "авг.", 9: "сент.", 10: "окт.", 11: "нояб.", 12: "дек."
}
def fmt_rus_short(d):
return f"{d.day} {months_ru[d.month]} {d.year}г."
def fmt_dots(d):
return f"{d.day:02d}.{d.month:02d}.{d.year}"
d2_str = fmt_rus_short(d2)
today_str = fmt_rus_short(today)
# Параметры для белой пунктирной рамки вокруг дат
bbox_props = dict(boxstyle="round,pad=0.4", fc="none", ec="white", lw=1.4, linestyle="--")
# Верхняя центральная дата: по центру вверху холста, крупный размер
ax.text(0.5, 0.98, d2_str, ha="center", va="top", fontsize=18, color="#ffffff",
transform=fig.transFigure, bbox=bbox_props, zorder=30)
# Нижняя центральная дата: по центру внизу холста, аналогичный стиль (чуть меньше)
ax.text(0.5, 0.02, today_str, ha="center", va="bottom", fontsize=16, color="#ffffff",
transform=fig.transFigure, bbox=bbox_props, zorder=30)
# Подписи-аннотации к секторам — теперь используют переменные d1 и d2
kw = dict(arrowprops=dict(arrowstyle="-", color="#ffffff"),
bbox=dict(boxstyle="round,pad=0.3", fc="#1e1e1e", ec="#444444", lw=0.8),
zorder=10, va="center")
ax.annotate(f"{fmt_dots(d1)}\n{diff1} дн\n{pct1:.2f}%", xy=(0.1, 0.86), xytext=(1.05, 0.9), textcoords="axes fraction", **kw)
ax.annotate(f"{fmt_dots(d2)}\n{diff2} дн\n{pct2:.2f}%", xy=(0.9, 0.2), xytext=(1.05, 0.3), textcoords="axes fraction", **kw)
ax.axis("equal")
labels = [f"{fmt_dots(d1)}: {diff1} дн ({pct1:.2f}%)", f"{fmt_dots(d2)}: {diff2} дн ({pct2:.2f}%)"]
legend = ax.legend(wedges_outer, labels, title="Доля", loc="center left", bbox_to_anchor=(1, 0.5))
plt.setp(legend.get_texts(), color="#eeeeee")
legend.get_frame().set_facecolor("#282828")
legend.get_frame().set_edgecolor("#555555")
plt.tight_layout(rect=[0, 0.03, 1, 0.95]) # оставляем место сверху/снизу для текста
def random_filename(ext="png", length=6):
name = "".join(random.choices(string.ascii_lowercase + string.digits, k=length))
return f"{name}.{ext}"
out_name = random_filename()
plt.savefig(out_name, dpi=150, bbox_inches="tight", facecolor=fig.get_facecolor())
print("Saved to:", os.path.abspath(out_name))
plt.show()
Editor is loading...
Leave a Comment