python

Mydays
Anonymous
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