100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
import matplotlib.pyplot as plt
|
|
import pandas as pd
|
|
import numpy as np
|
|
from matplotlib.patches import Rectangle
|
|
|
|
# Data for the pie chart
|
|
labels = ['Tekanan Darah Sistolik', 'Berat Badan', 'Tekanan Darah Diastolik']
|
|
en_labels = ['Systolic Blood Pressure', 'Weight', 'Diastolic Blood Pressure']
|
|
values = [66.8, 18.9, 14.2]
|
|
colors = ['#F77F7F', '#FFB84C', '#5ECCC4'] # Red, Orange, Teal
|
|
|
|
# Data for the table
|
|
current_readings = [132, 70, 88]
|
|
target_values = ['< 130', '41,6-51,5', '< 85']
|
|
units = ['mmHg', 'kg', 'mmHg']
|
|
|
|
# Create figure with subplots
|
|
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10),
|
|
gridspec_kw={'height_ratios': [1, 0.8]})
|
|
plt.subplots_adjust(hspace=0.3)
|
|
|
|
# Pie Chart
|
|
wedges, texts, autotexts = ax1.pie(values, colors=colors, autopct='',
|
|
startangle=90, wedgeprops={'edgecolor': 'white', 'linewidth': 1})
|
|
|
|
# Title
|
|
ax1.set_title('Kontributor Risiko Relatif\nRelative Risk Contributors', fontsize=16, fontweight='bold', pad=20)
|
|
|
|
# Add custom labels outside the pie
|
|
for i, p in enumerate(wedges):
|
|
ang = (p.theta2 - p.theta1)/2. + p.theta1
|
|
ang_rad = ang * np.pi / 180
|
|
x = 1.05 * np.cos(ang_rad)
|
|
y = 1.05 * np.sin(ang_rad)
|
|
|
|
# Alignment based on angle
|
|
horizontalalignment = 'left' if x > 0 else 'right'
|
|
|
|
# Create the label text with percentage and name
|
|
label = f"{values[i]}% {labels[i]}"
|
|
|
|
# Add the label
|
|
ax1.annotate(label, xy=(x, y), xytext=(1*x, 1*y),
|
|
horizontalalignment=horizontalalignment, fontsize=12)
|
|
|
|
# Equal aspect ratio ensures the pie chart is circular
|
|
ax1.set_aspect('equal')
|
|
ax1.axis('off')
|
|
|
|
# Table
|
|
# Hide axes for the table subplot
|
|
ax2.axis('off')
|
|
|
|
# Create table headers
|
|
col_labels = ['Kontributor Risiko\nRisk Contributor', 'Bacaan saat ini\nCurrent reading',
|
|
'Nilai Target\nTarget value', 'Satuan\nUnits']
|
|
table_data = []
|
|
|
|
# Prepare colored boxes for the legend
|
|
for i, (label, en_label, value, target, unit) in enumerate(zip(labels, en_labels, current_readings, target_values, units)):
|
|
color_box = f'\n{label}\n{en_label}'
|
|
table_data.append([color_box, value, target, unit])
|
|
|
|
# Create table
|
|
table = ax2.table(cellText=table_data, colLabels=col_labels, loc='center',
|
|
cellLoc='center', colWidths=[0.4, 0.2, 0.2, 0.2])
|
|
|
|
# Format table
|
|
table.auto_set_font_size(False)
|
|
table.set_fontsize(10)
|
|
table.scale(1, 2.15)
|
|
|
|
# Add color boxes to the first column of each data row
|
|
for i in range(len(table_data)):
|
|
cell = table[i+1, 0] # +1 because header is row 0
|
|
cell.get_text().set_color('black')
|
|
cell.set_facecolor(colors[i])
|
|
cell.set_text_props(weight='bold')
|
|
|
|
# Add horizontal lines
|
|
for i in range(len(table_data)+1):
|
|
for j in range(len(col_labels)):
|
|
table[i, j].set_edgecolor('black')
|
|
|
|
# Add risk information at the bottom
|
|
risk_text = 'Risiko Hipertensi dalam 4 Tahun\nHypertension Risk in 4 Years'
|
|
current_risk = '51,2 %'
|
|
target_risk = '8,3 %'
|
|
|
|
ax2.text(0.00, 0.1, risk_text, transform=ax2.transAxes,
|
|
color='red', fontsize=12, fontweight='bold')
|
|
ax2.text(0.45, 0.15, current_risk, transform=ax2.transAxes,
|
|
color='red', fontsize=12, fontweight='bold')
|
|
ax2.text(0.68, 0.15, target_risk, transform=ax2.transAxes,
|
|
color='black', fontsize=12)
|
|
|
|
filename = '3_pie_suggested_lifestyle.png'
|
|
plt.tight_layout()
|
|
plt.savefig(filename, dpi=300, bbox_inches='tight')
|
|
print(f"Image saved as {filename}") |