修改深色模式下结果图片显示异常
This commit is contained in:
@@ -4,6 +4,7 @@ Step 2 重构:从 pqAutomationApp.PQAutomationApp.plot_cct 原样搬迁。
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
from app.views.modern_styles import get_theme_palette
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
@@ -11,11 +12,36 @@ if TYPE_CHECKING:
|
||||
from pqAutomationApp import PQAutomationApp
|
||||
|
||||
|
||||
def _is_dark_palette(palette: dict[str, str]) -> bool:
|
||||
"""根据主题背景色亮度判断是否深色主题。"""
|
||||
bg = palette.get("bg", "#FFFFFF").lstrip("#")
|
||||
try:
|
||||
r = int(bg[0:2], 16)
|
||||
g = int(bg[2:4], 16)
|
||||
b = int(bg[4:6], 16)
|
||||
except Exception:
|
||||
return False
|
||||
return (r * 299 + g * 587 + b * 114) / 1000 < 128
|
||||
|
||||
|
||||
|
||||
def plot_cct(self: "PQAutomationApp", test_type):
|
||||
"""绘制 x 和 y 坐标分离图 - 每个点标注纵坐标值"""
|
||||
palette = get_theme_palette()
|
||||
dark_mode = _is_dark_palette(palette)
|
||||
x_line_color = "#2F8BFF" if dark_mode else "#0A4BFF"
|
||||
y_line_color = "#FF4D4D" if dark_mode else "#D90429"
|
||||
ideal_line_color = "#00C853" if dark_mode else "#198754"
|
||||
x_tol_color = "#FF7070" if dark_mode else "#C0392B"
|
||||
y_tol_color = "#FFB74D" if dark_mode else "#D68910"
|
||||
grid_color = "#566070" if dark_mode else "#B8BDC3"
|
||||
axis_text = "#EDF2FA" if dark_mode else palette["fg"]
|
||||
axis_sub_text = "#C8D2E0" if dark_mode else "#222222"
|
||||
legend_bg = "#131821" if dark_mode else "#FFFFFF"
|
||||
legend_edge = "#A4B2C6" if dark_mode else palette["border"]
|
||||
|
||||
self.cct_fig.clear()
|
||||
self.cct_fig.patch.set_facecolor(palette["bg"])
|
||||
|
||||
gray_data = self.results.get_intermediate_data("shared", "gray")
|
||||
if not gray_data:
|
||||
@@ -31,7 +57,7 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
ha="center",
|
||||
va="center",
|
||||
fontsize=14,
|
||||
color="red",
|
||||
color=palette["danger"],
|
||||
)
|
||||
ax.axis("off")
|
||||
self.cct_canvas.draw()
|
||||
@@ -111,12 +137,20 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
# 为所有测试类型创建子图
|
||||
ax1 = self.cct_fig.add_subplot(211)
|
||||
ax2 = self.cct_fig.add_subplot(212)
|
||||
for ax in (ax1, ax2):
|
||||
ax.set_facecolor(palette["card_bg"])
|
||||
for spine in ax.spines.values():
|
||||
spine.set_color(palette["border"])
|
||||
ax.tick_params(labelsize=8, colors=axis_sub_text)
|
||||
ax.xaxis.label.set_color(axis_text)
|
||||
ax.yaxis.label.set_color(axis_text)
|
||||
|
||||
# ========== 上图:x coordinates ==========
|
||||
ax1.plot(
|
||||
grayscale,
|
||||
x_measured,
|
||||
"b-o",
|
||||
color=x_line_color,
|
||||
marker="o",
|
||||
label="屏本体",
|
||||
linewidth=2,
|
||||
markersize=4,
|
||||
@@ -133,13 +167,13 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
ha="center",
|
||||
va="bottom",
|
||||
fontsize=7,
|
||||
color="blue",
|
||||
color=x_line_color,
|
||||
bbox=dict(
|
||||
boxstyle="round,pad=0.2",
|
||||
facecolor="white",
|
||||
edgecolor="blue",
|
||||
alpha=0.8,
|
||||
linewidth=0.5,
|
||||
facecolor=palette["card_bg"],
|
||||
edgecolor=x_line_color,
|
||||
alpha=0.92 if dark_mode else 0.85,
|
||||
linewidth=0.8,
|
||||
),
|
||||
)
|
||||
|
||||
@@ -147,7 +181,7 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
full_grayscale = np.linspace(0, 100, 100)
|
||||
ax1.axhline(
|
||||
y=x_ideal,
|
||||
color="green",
|
||||
color=ideal_line_color,
|
||||
linestyle="--",
|
||||
linewidth=1.5,
|
||||
label=f"x-ideal ({x_ideal:.4f})",
|
||||
@@ -155,30 +189,34 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
)
|
||||
ax1.axhline(
|
||||
y=x_low,
|
||||
color="red",
|
||||
color=x_tol_color,
|
||||
linestyle=":",
|
||||
linewidth=1,
|
||||
alpha=0.7,
|
||||
alpha=0.95 if dark_mode else 0.7,
|
||||
label=f"x-low ({x_low:.4f})",
|
||||
zorder=2,
|
||||
)
|
||||
ax1.axhline(
|
||||
y=x_high,
|
||||
color="red",
|
||||
color=x_tol_color,
|
||||
linestyle=":",
|
||||
linewidth=1,
|
||||
alpha=0.7,
|
||||
alpha=0.95 if dark_mode else 0.7,
|
||||
label=f"x-high ({x_high:.4f})",
|
||||
zorder=2,
|
||||
)
|
||||
ax1.fill_between(
|
||||
full_grayscale, x_low, x_high, alpha=0.15, color="blue", zorder=1
|
||||
full_grayscale,
|
||||
x_low,
|
||||
x_high,
|
||||
alpha=0.22 if dark_mode else 0.15,
|
||||
color=x_line_color,
|
||||
zorder=1,
|
||||
)
|
||||
|
||||
ax1.set_xlabel("灰阶 (%)", fontsize=9)
|
||||
ax1.set_ylabel("CIE x", fontsize=9)
|
||||
ax1.grid(True, linestyle="--", alpha=0.3)
|
||||
ax1.tick_params(labelsize=8)
|
||||
ax1.set_xlabel("灰阶 (%)", fontsize=9, color=axis_text)
|
||||
ax1.set_ylabel("CIE x", fontsize=9, color=axis_text)
|
||||
ax1.grid(True, linestyle="--", alpha=0.45 if dark_mode else 0.3, color=grid_color)
|
||||
ax1.set_xlim(0, 105)
|
||||
|
||||
# 纵坐标范围由用户参数控制
|
||||
@@ -211,7 +249,8 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
ax2.plot(
|
||||
grayscale,
|
||||
y_measured,
|
||||
"r-o",
|
||||
color=y_line_color,
|
||||
marker="o",
|
||||
label="屏本体",
|
||||
linewidth=2,
|
||||
markersize=4,
|
||||
@@ -228,19 +267,19 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
ha="center",
|
||||
va="bottom",
|
||||
fontsize=7,
|
||||
color="red",
|
||||
color=y_line_color,
|
||||
bbox=dict(
|
||||
boxstyle="round,pad=0.2",
|
||||
facecolor="white",
|
||||
edgecolor="red",
|
||||
alpha=0.8,
|
||||
linewidth=0.5,
|
||||
facecolor=palette["card_bg"],
|
||||
edgecolor=y_line_color,
|
||||
alpha=0.92 if dark_mode else 0.85,
|
||||
linewidth=0.8,
|
||||
),
|
||||
)
|
||||
|
||||
ax2.axhline(
|
||||
y=y_ideal,
|
||||
color="green",
|
||||
color=ideal_line_color,
|
||||
linestyle="--",
|
||||
linewidth=1.5,
|
||||
label=f"y-ideal ({y_ideal:.4f})",
|
||||
@@ -248,30 +287,34 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
)
|
||||
ax2.axhline(
|
||||
y=y_low,
|
||||
color="orange",
|
||||
color=y_tol_color,
|
||||
linestyle=":",
|
||||
linewidth=1,
|
||||
alpha=0.7,
|
||||
alpha=0.95 if dark_mode else 0.7,
|
||||
label=f"y-low ({y_low:.4f})",
|
||||
zorder=2,
|
||||
)
|
||||
ax2.axhline(
|
||||
y=y_high,
|
||||
color="orange",
|
||||
color=y_tol_color,
|
||||
linestyle=":",
|
||||
linewidth=1,
|
||||
alpha=0.7,
|
||||
alpha=0.95 if dark_mode else 0.7,
|
||||
label=f"y-high ({y_high:.4f})",
|
||||
zorder=2,
|
||||
)
|
||||
ax2.fill_between(
|
||||
full_grayscale, y_low, y_high, alpha=0.15, color="orange", zorder=1
|
||||
full_grayscale,
|
||||
y_low,
|
||||
y_high,
|
||||
alpha=0.22 if dark_mode else 0.15,
|
||||
color=y_tol_color,
|
||||
zorder=1,
|
||||
)
|
||||
|
||||
ax2.set_xlabel("灰阶 (%)", fontsize=9)
|
||||
ax2.set_ylabel("CIE y", fontsize=9)
|
||||
ax2.grid(True, linestyle="--", alpha=0.3)
|
||||
ax2.tick_params(labelsize=8)
|
||||
ax2.set_xlabel("灰阶 (%)", fontsize=9, color=axis_text)
|
||||
ax2.set_ylabel("CIE y", fontsize=9, color=axis_text)
|
||||
ax2.grid(True, linestyle="--", alpha=0.45 if dark_mode else 0.3, color=grid_color)
|
||||
ax2.set_xlim(0, 105)
|
||||
|
||||
# 纵坐标范围由用户参数控制
|
||||
@@ -307,6 +350,7 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
fontsize=12,
|
||||
y=0.98,
|
||||
fontweight="bold",
|
||||
color=palette["fg"],
|
||||
)
|
||||
|
||||
self.cct_fig.subplots_adjust(
|
||||
@@ -317,12 +361,25 @@ def plot_cct(self: "PQAutomationApp", test_type):
|
||||
hspace=0.30,
|
||||
)
|
||||
|
||||
ax1.legend(
|
||||
fontsize=7, loc="center left", bbox_to_anchor=(1.05, 0.5), framealpha=1.0
|
||||
legend1 = ax1.legend(
|
||||
fontsize=7,
|
||||
loc="center left",
|
||||
bbox_to_anchor=(1.05, 0.5),
|
||||
framealpha=0.92 if dark_mode else 1.0,
|
||||
facecolor=legend_bg,
|
||||
edgecolor=legend_edge,
|
||||
)
|
||||
ax2.legend(
|
||||
fontsize=7, loc="center left", bbox_to_anchor=(1.05, 0.5), framealpha=1.0
|
||||
legend2 = ax2.legend(
|
||||
fontsize=7,
|
||||
loc="center left",
|
||||
bbox_to_anchor=(1.05, 0.5),
|
||||
framealpha=0.92 if dark_mode else 1.0,
|
||||
facecolor=legend_bg,
|
||||
edgecolor=legend_edge,
|
||||
)
|
||||
for legend in (legend1, legend2):
|
||||
for text in legend.get_texts():
|
||||
text.set_color(axis_text)
|
||||
|
||||
self.cct_canvas.draw()
|
||||
self.chart_notebook.select(self.cct_chart_frame)
|
||||
|
||||
Reference in New Issue
Block a user