'update'
This commit is contained in:
38
charts.py
38
charts.py
@@ -142,11 +142,32 @@ class BubbleMetricsWidget(QWidget):
|
||||
content_rect = QRectF(rect.left()+margin, rect.top()+title_height+margin, rect.width()-2*margin, rect.height()-title_height-2*margin)
|
||||
if not self.metrics:
|
||||
p.drawText(rect, Qt.AlignmentFlag.AlignCenter, '暂无数据'); p.end(); return
|
||||
# 归一化
|
||||
minute_values = [(v*60 if u=='h' else v) for (lbl,v,u,c) in self.metrics]
|
||||
# 归一化:统一把不同单位数值映射到“分钟等价”尺度,以便半径比较
|
||||
# 规则:小时(h) -> v*60;分钟(m) -> v;书本数量(book) -> v*60 (一书折算 1 小时,避免过小)
|
||||
minute_values = []
|
||||
for (lbl, v, u, c) in self.metrics:
|
||||
if u == 'h':
|
||||
minute_values.append(v * 60)
|
||||
elif u == 'm':
|
||||
minute_values.append(v)
|
||||
elif u == 'book': # 新增:书籍数量指标
|
||||
minute_values.append(v * 60) # 折算:1 本 ≈ 60 分钟,使气泡视觉权重合理
|
||||
else: # 未知单位直接使用原值
|
||||
minute_values.append(v)
|
||||
max_minutes = max(minute_values) if minute_values else 1
|
||||
radii_norm = [0.3 + 0.7 * math.sqrt((mv/max_minutes) if max_minutes>0 else 0) for mv in minute_values]
|
||||
default_pos = { '全年':(0.20,0.50), '月均':(0.50,0.18), '近7天':(0.80,0.50), '日均':(0.50,0.82) }
|
||||
# 默认布局:4 指标与 5 指标(包含“已读”)使用不同的预设坐标,尽量避免重叠
|
||||
labels = [m[0] for m in self.metrics]
|
||||
if '已读' in labels and len(labels) >= 5:
|
||||
default_pos = {
|
||||
'全年': (0.18, 0.55),
|
||||
'月均': (0.38, 0.20),
|
||||
'近7天': (0.82, 0.55),
|
||||
'日均': (0.38, 0.85),
|
||||
'已读': (0.60, 0.55)
|
||||
}
|
||||
else:
|
||||
default_pos = { '全年':(0.20,0.50), '月均':(0.50,0.18), '近7天':(0.80,0.50), '日均':(0.50,0.82), '已读':(0.50,0.50) }
|
||||
if any(lbl not in default_pos for (lbl,*_) in self.metrics):
|
||||
step = 1.0/(len(self.metrics)+1)
|
||||
default_pos = {m[0]:(step*(i+1),0.5) for i,m in enumerate(self.metrics)}
|
||||
@@ -170,8 +191,15 @@ class BubbleMetricsWidget(QWidget):
|
||||
p.setPen(QPen(QColor('#ffffff'),2)); p.setBrush(QColor(color)); p.drawEllipse(circle_rect)
|
||||
p.setPen(QColor('#ffffff'))
|
||||
f = p.font(); f.setBold(True); f.setPointSize(max(9,int(R/5))); p.setFont(f)
|
||||
txt = f"{val:.0f} 小时" if unit=='h' and val>=10 else (f"{val:.1f} 小时" if unit=='h' else f"{val:.0f} 分钟")
|
||||
p.drawText(circle_rect, Qt.AlignmentFlag.AlignCenter, f"{txt}\n{label}")
|
||||
if unit == 'h':
|
||||
txt_core = f"{val:.0f} 小时" if val >= 10 else f"{val:.1f} 小时"
|
||||
elif unit == 'm':
|
||||
txt_core = f"{val:.0f} 分钟"
|
||||
elif unit == 'book':
|
||||
txt_core = f"{val:.0f} 本书"
|
||||
else:
|
||||
txt_core = f"{val:.0f}"
|
||||
p.drawText(circle_rect, Qt.AlignmentFlag.AlignCenter, f"{txt_core}\n{label}")
|
||||
# 标题(为空保留对齐占位)
|
||||
p.setPen(QColor('#222222'))
|
||||
f = p.font(); f.setBold(True); f.setPointSize(10); p.setFont(f)
|
||||
|
||||
Reference in New Issue
Block a user