نمودار زیبا میتواند محاسبهای درست را گمراهکننده نمایش دهد، محاسبهای غلط را معتبر جلوه دهد یا Unknown را پشت رنگ سبز پنهان کند. بصریسازی دادههای تست زمانی قابل اتکاست که مسیر Source→Rows→Transform→Aggregate→Scale→Marks→Alternative نسخهدار و قابل ممیزی باشد. این راهنما مالک «Chart Contract و Visual QA» است: ساخت، آزمون، انتشار و اصلاح یک نمودار مستقل؛ نه معماری کل داشبورد یا فن ارائهٔ مدیریتی.
برای معماری داشبورد به راهنمای داشبورد گزارش تست، برای Readout چندلایه به ارائهٔ نتایج تست و برای Snapshot پایانی به گزارش خلاصه تست بروید. این مقاله یک واحد کوچکتر را مهندسی میکند: نموداری که ادعایش، دادهاش، تبدیلش و جایگزین متنیاش بازسازیپذیر باشد.
پاسخ کوتاه: بصریسازی دادههای تست چیست؟
بصریسازی دادههای تست نگاشت دادهٔ تعریفشده به موقعیت، طول، رنگ، شکل یا اندازه برای پاسخ به یک سؤال مشخص است. نمودار خودِ Evidence یا Decision نیست؛ Viewی از داده و تبدیل است. مخاطب باید بتواند Population، مخرج، Status، زمان، Scale، Missingness، Uncertainty، Source و نسخه را بفهمد و همان اعداد را در جدول یا Export معادل بازیابی کند.
| لایه | پرسش | خطر |
|---|---|---|
| Source | داده از کجا و کدام نسخه؟ | stale/wrong join |
| Semantic | هر Row و Status چه معنایی دارد؟ | count inflation |
| Transform | filter/dedupe/bin/aggregate چیست؟ | hidden exclusion |
| Encoding | Field به کدام channel/scale میرود؟ | visual distortion |
| Alternative | بدون تصویر چه اطلاعاتی میماند؟ | access barrier |
مرز مالکیت: Chart، Dashboard، Report و Readout
| Artifact | مالک سؤال | این راهنما؟ |
|---|---|---|
| Chart | یک رابطه/مقایسه/توزیع چگونه Encode شد؟ | بله |
| Dashboard | چند View چگونه به تصمیم و Drill-down وصلاند؟ | خیر |
| Status/Completion Report | کدام Snapshot و Artifact گزارش میشود؟ | خیر |
| Decision Readout | Claim/Evidence/Uncertainty برای مخاطب چگونه ارائه شود؟ | خیر |
| Metric governance | Metric چرا و با چه سیاستی وجود دارد؟ | خیر |
تعریف و حاکمیت KPI در راهنمای KPI تضمین کیفیت و فرمولهای متریک در راهنمای متریکهای تست قرار دارند. Chart Contract نباید فرمول یا تصمیم را بیصدا اختراع کند.
از سؤال شروع کنید، نه از نوع نمودار
| سؤال | رابطه | View آغازین |
|---|---|---|
| کدام گروه بیشتر/کمتر است؟ | Comparison | Bar/Dot |
| در زمان چه تغییری رخ داده؟ | Temporal | Line/step |
| مقادیر چگونه پخش شدهاند؟ | Distribution | Histogram/box/ECDF |
| دو متغیر چگونه همراهاند؟ | Relationship | Scatter |
| سهم اجزا از کل چیست؟ | Composition | Stacked bar/table |
| دو بعد دستهای کجا متراکماند؟ | Matrix | Heatmap + labels |
| برآورد چقدر نامطمئن است؟ | Interval | Dot/interval |
«برای گزارش روزانه همیشه Pie» یا «برای مدیر همیشه Gauge» پاسخ معتبری نیست. سؤال، نوع داده، تعداد دسته، مقایسهٔ مورد انتظار، اندازهٔ صفحه و alternative تعیینکنندهاند.
Chart Contract پیش از کد یا BI ساخته میشود
Chart Contract chart_id/version/status: decision_question + allowed_use: claim_boundary: source/dataset/query/spec versions: grain/identity/population/window: fields/types/units/status vocabulary: filter/dedupe/join/bin/aggregate/formula: missing/late/invalid/exclusion rules: mark/channels/scale/domain/baseline/sort: labels/annotations/uncertainty/support: short description/long description/table/export: refresh/freshness/owner/review/correction:
ادعای نمودار را محدود و قابل رد کنید
«کیفیت بهتر شد» معمولاً بزرگتر از داده است. «در Snapshotهای C1 تا C3، Pass/Executed از ۸۰٪ به ۹۵٪ تغییر کرد» قابل ممیزیتر است، ولی هنوز دربارهٔ Coverage، Risk، Population ثباتدار یا Release readiness ادعا نمیکند. Claim، alternative explanation و prohibited use را بنویسید.
Chart Claim observation: population/window: formula/encoding: support/missingness: known changes: alternative explanations: does_not_establish: reviewer/observed_at:
Dataset Identity را منجمد کنید
Source name کافی نیست. Snapshot/export/query version، schema، extraction time، cutoff، timezone، lineage، filter parameters، content hash و access classification را ثبت کنید. یک نمودار Live و یک نمودار آرشیوی ممکن است از نام یکسان اما Rowهای متفاوت ساخته شوند.
Dataset Manifest dataset_id/version/hash: source systems + schema versions: query/transform commit: extracted_at/cutoff/timezone: row grain + primary identity: population/inclusions/exclusions: late-data/backfill policy: quality state: VALID | STALE | INVALID | UNKNOWN owner/access/retention:
Grain و Identity جلوی شمارش دوگانه را میگیرند
هر Row چیست: Test identity، Attempt، Result event، Defect report یا Canonical defect؟ Retry ممکن است دو Result event و یک Final outcome بسازد. Duplicate Report ممکن است چند Source و یک Defect باشد. Chart title باید واحد شمارش را بگوید و dedupe key/version را ثبت کند.
| Row grain | Count پاسخ میدهد | سوءبرداشت |
|---|---|---|
| Result event | چند event ثبت شد؟ | چند Test نهایی؟ |
| Final test outcome | چند Test به کدام Outcome رسید؟ | چند Attempt؟ |
| Source report | چند Signal آمد؟ | چند Defect؟ |
| Canonical defect | چند نقص متمایز؟ | چند کاربر/رخداد؟ |
| Request sample | چند Observation؟ | چند User؟ |
Population و Denominator باید داخل View بمانند
Pass Rate بدون مخرج یک Label مبهم است. Passed/(Passed+Failed)، Passed/Planned و Execution completion پرسشهای متفاوت دارند. Counts و Status treatment را کنار نسبت یا در alternative table نگه دارید. برای گزارش رسمی Status و Release از راهنمای گزارش تست حرفهای استفاده کنید.
Statusها را به صفر یا Pass تبدیل نکنید
| Status | نمایش | رفتار ممنوع |
|---|---|---|
| Blocked | Count/segment مستقل | حذف بیاعلان |
| Not Run | Population gap | Pass فرضکردن |
| Inconclusive | Unknown evidence | Fail/zero اجباری |
| Invalid | Data-quality exception | Outcome معتبر |
| Missing | Missingness annotation | صفر |
| Not applicable | Exclusion با دلیل | Missing |
Transformها بخشی از معنا هستند
Filter، join، dedupe، pivot، normalize، bin، aggregate و calculate را مخفی نکنید. مستند رسمی Vega-Lite Encoding Field و نوع معنایی Quantitative/Temporal/Ordinal/Nominal و Transformهای aggregate/bin/sort/stack/timeUnit را صریح میکند. این مرجع یک Syntax فنی است، نه سیاست عمومی QA یا تضمین Chart correctness.
Transform Contract input grain: filters + reason: join keys/cardinality/unmatched behavior: dedupe identity/winner rule: calculated fields/formulas: groupby + aggregate: bin/timeUnit/timezone: sort/stack/normalize: output grain + reconciliation:
Aggregation یک جدول تازه میسازد
مستند رسمی Vega-Lite Aggregation توضیح میدهد Aggregate برای هر Group یک Record خلاصه میسازد. بنابراین groupby، operation و output field را مشخص کنید. Count، valid count، sum، mean، median، percentile و rate قابل جایگزینی نیستند.
| Aggregate | کاربرد محدود | ریسک |
|---|---|---|
| Count | تعداد Row با grain معلوم | duplicate/mix |
| Mean | مرکز عددی با توزیع مناسب | tail پنهان |
| Median | مرکز مقاومتر | spread پنهان |
| p95 | Tail quantile با روش معلوم | sample/algorithm |
| Rate | numerator/denominator | denominator drift |
| Sum | کل additive | non-additive metric |
زمان را با Window، Bucket و Timezone قرارداد کنید
Event time، ingestion time، execution end و defect close time یکسان نیستند. Window نیمهباز، bucket روز/هفته، UTC storage، timezone نمایش، DST/Jalali/holiday mapping، late arrival و backfill را ثبت کنید. خطی که پس از backfill عوض میشود باید version/correction داشته باشد.
Time Contract event_timestamp: window: [start, end) bucket/timeUnit: storage_timezone: display_timezone/calendar: late_arrival_watermark: backfill/recompute policy: facts_as_of:
نمودار میلهای برای مقایسه، با خط مبنای صادقانه
Bar طول را از baseline مقایسه میکند؛ برای مقدارهای مثبت معمولاً baseline صفر لازم است. شکستن محور میتواند تفاوت کوچک را بزرگ جلوه دهد. Category order را semantic یا value-based و ثابت کنید، واحد و Count را نشان دهید و Horizontal bar را برای Label فارسی بلند در نظر بگیرید.
Dot Plot برای مقایسهٔ فشرده مناسب است
وقتی Category زیاد و baseline magnitude کمتر مهم است، Dot plot میتواند شلوغی را کم کند. Zero/domain همچنان باید معلوم باشد. برای دو مقدار، dumbbell اختلاف را نشان میدهد؛ اما ترتیب، جهت مطلوب/نامطلوب و فاصلهٔ عددی را Label کنید.
نمودار خطی فقط برای ترتیب زمانی معتبر ساخته میشود
Line بین نقطهها تداوم القا میکند. Snapshotهای نامنظم، gap، data freeze و تغییر تعریف Metric را علامت بزنید. برای سه Category بدون ترتیب، اتصال خطی نسازید. Axis غیرصفر در Trend گاهی قابل دفاع است، اما domain و دلیل باید آشکار باشد و magnitude را اغراق نکند.
Histogram به Bin Contract نیاز دارد
Histogram توزیع دادهٔ پیوسته را با bin boundaries نشان میدهد؛ Bar chart دستهها را مقایسه میکند. Bin width/start/end، inclusion boundary، overflow/underflow، missing و unit را ثبت کنید. تغییر Bin میتواند شکل توزیع را عوض کند؛ Export باید row-level یا جدول Bin را فراهم کند.
Box/Violin/ECDF را بدون Support تنها نگذارید
Box plot تعریف quartile/whisker و sample count میخواهد. Violin به smoothing وابسته است و با Sample کوچک شکل کاذب میسازد. ECDF تمام مشاهدهها را تجمعی نشان میدهد اما برای مخاطب ناآشنا توضیح لازم دارد. Median/p95 بدون Distribution و Support میتواند Tail یا mix را پنهان کند.
Scatter رابطه را نشان میدهد، نه علت را
هر Point باید واحد مشاهده و دو Field همزمان را داشته باشد. Overplot را با opacity/jitter/bin کنترل و transform را افشا کنید. Trend line، correlation coefficient یا cluster دلیل علی نیست؛ mix، exposure، size، time و selection میتواند هر دو محور را تغییر دهد.
Defect Density Heatmap نقشهٔ کیفیت نیست
Heatmap میتواند Module×Release یا Risk×Evidence را خلاصه کند، اما Color فقط مقدار Contractشده را Encode میکند. تراکم نقص به تعریف Defect و Size denominator وابسته است و «ماژول قرمز = کد بیکیفیت» نتیجهٔ خودکار نیست. محدودیت کامل در راهنمای چگالی نقص آمده است.
| Heatmap contract | نمونه |
|---|---|
| row/column identities | Risk×Build |
| cell aggregate | valid evidence count |
| scale/domain | 0–4 sequential |
| missing cell | Unknown hatch + text |
| labels | exact value/status |
| alternative | accessible matrix table |
Pie و Donut را پیشفرض نکنید
زاویه و مساحت برای مقایسهٔ سهمهای نزدیک دشوار است؛ دستههای زیاد، قطعههای کوچک و Legend دور خوانایی را کم میکنند. اگر composition ساده، mutually exclusive و جمع دقیقاً کل است، Pie با Label مستقیم شاید قابل استفاده باشد. در بسیاری موارد sorted bar یا table مقایسه را روشنتر میکند.
Stacked Bar ترکیب را نشان میدهد، اما مقایسه را محدود میکند
فقط Segment متصل به baseline بهراحتی مقایسه میشود. ۱۰۰% stacked composition را نشان میدهد و Count کل را پنهان میکند؛ absolute stacked Count را نشان میدهد اما سهم را سختتر میکند. Count و درصد و ترتیب Stack را در جدول جایگزین نگه دارید.
Gauge و Speedometer اطلاعات کمی در فضای زیاد میدهند
Gauge اغلب یک مقدار، Target و رنگ را بدون History/Population نشان میدهد. اگر Threshold واقعاً قراردادی است، عدد+هدف+trend+freshness یا bullet chart معمولاً فشردهتر است. رنگ سبز نباید Release decision یا کفایت Risk evidence را القا کند.
Dual Axis و 3D پیشفرض خطرناکاند
دو محور با Scaleهای قابل تنظیم میتوانند همحرکتی مصنوعی بسازند. دو Panel همتراز یا normalized view با توضیح اغلب امنتر است. 3D طول/زاویه را تحریف و Occlusion ایجاد میکند. Decoration، shadow و gradient نباید data mark را جایگزین کند.
Scale Contract را صریح کنید
| Scale | کاربرد | افشا |
|---|---|---|
| Linear | فاصلهٔ برابر عددی | domain/unit |
| Log | orders of magnitude و مقادیر مثبت | base/zero excluded |
| Ordinal | ترتیب قراردادی | order meaning |
| Sequential colour | کم→زیاد | domain/missing |
| Diverging colour | حول midpoint معنادار | midpoint/limits |
| Threshold | bands قراردادی | boundary/owner/version |
Baseline و Domain میتوانند داستان را عوض کنند
Bar با domain ۷۵–۱۰۰ اختلاف ۸۰ تا ۹۵ را بسیار بزرگ میکند. Line با domain محدود ممکن است برای Variation جزئی مفید باشد، به شرط نمایش دقیق domain، context و alternative. Percentage axis نیز اگر Metric امکان ۰ تا ۱۰۰ دارد، قطعکردن باید دلیل داشته باشد.
Sort، Stack و Legend تصمیمهای معناییاند
Sort براساس مقدار، alphabet، lifecycle یا risk order پیام متفاوت میسازد. Legend order باید با Stack/Line/Reading order همسان باشد. Label مستقیم وابستگی به تطبیق رنگ را کم میکند. Categoryهای فارسی را با collation و ترتیب قراردادی پایدار کنید.
رنگ را تنها حامل معنا نکنید
راهنمای رسمی Government Analysis Function دربارهٔ رنگ نمودار توصیه میکند به رنگ تنها تکیه نشود و جایگزین متنی فراهم باشد. Series را مستقیم نامگذاری کنید و از Shape/line style/text نیز استفاده کنید. Red/Green ممکن است علاوه بر دسترسپذیری، Pass/Fail یا Risk semantics ناخواسته بسازد.
عنوان، Subtitle و Footnote بخشی از دادهاند
Chart Text Packet headline: observation without causal overclaim formal_title: metric + population + place/scope + window subtitle: denominator/status/baseline source: dataset/query/spec version + facts-as-of footnotes: exclusions/missing/change/uncertainty unit labels: direct series labels: link to table/download:
Annotation باید رویداد را نشان دهد، نه علت را جعل کند
Release، tool migration، policy change، outage یا data backfill را با Source و timestamp علامت بزنید. «پس از تغییر X» با «به علت X» فرق دارد. Annotation نباید روی داده را بپوشاند و در long description/table note نیز بازتاب یابد.
Uncertainty و Support را قابل دیدن کنید
Count، sample size، missing، interval، range یا variability را متناسب با Claim نشان دهید. Error bar بدون تعریف روش بیمعناست. Confidence interval علت، اهمیت یا احتمال درستبودن فرضیه نیست. Snapshot کامل یک Run نیز ممکن است uncertainty اندازهگیری، environment یا representativeness داشته باشد.
Comparable Trend قرارداد ثبات میخواهد
| بُعد | ثابت/افشاشده |
|---|---|
| Population/cohort | identity/mix/size |
| Metric | formula/status |
| Source | schema/query/instrument |
| Window | duration/cutoff/season |
| Environment | build/config/load |
| Process | discovery/triage/automation |
| Missingness | coverage/late data |
برای تفسیر جهت شاخص، نه طراحی نمودار، به راهنمای شاخصهای پیشرو و پسرو مراجعه کنید. یک خط صعودی لزوماً «پیشرو» یا مطلوب نیست.
Small Multiples مقایسه را بدون Dual Axis حفظ میکند
Panelهای هماندازه با Scale یکسان برای Sliceها مناسباند. راهنمای Accessible Charts دولت بریتانیا نیز برای Small multiples بر یکسانبودن Scale محورهای عددی تأکید میکند. Support و missing panel را نشان دهید؛ Panel خالی ممکن است No data باشد، نه صفر.
دسترسپذیری نمودار فقط Palette نیست
W3C WAI برای تصاویر پیچیده نمودار را نیازمند توضیح کوتاه برای شناسایی و توضیح بلند برای اطلاعات ضروری میداند و نمونهٔ ساختاریافته با جدول ارائه میکند. Alt کوتاه جای جدول، Scale، Values و Trend را نمیگیرد. Alternative باید همراه نسخهٔ نمودار بهروز شود.
Chart Accessibility Packet short_description: chart type + subject + scope/window long_description: question + values + scale + relationships + limits equivalent_table/download: non_colour labels/patterns: contrast/text size/zoom: reading order/headings/caption: keyboard/focus/tooltip alternative: RTL/mobile/PDF/print checks: tested_by/build/date/known_limits:
جدول جایگزین باید همان Data View باشد
Table نباید از Query دیگری یا Snapshot تازهتر ساخته شود. Row/column header، caption، units، exact values، Status، missing و footnoteها را حفظ کنید. Download ماشینخوان نیز delimiter/encoding/schema/version داشته باشد. جدول جایگزین لزوماً همهٔ Raw data حساس را منتشر نمیکند؛ همان View مجاز را معادل میکند.
Interactive Chart به Keyboard و State Contract نیاز دارد
| Interaction | Contract |
|---|---|
| Filter | active state/clear/default/URL or export |
| Tooltip | keyboard/touch/text alternative |
| Zoom/pan | reset/domain disclosure |
| Drill-down | identity/context preserved |
| Selection | visible focus/non-colour state |
| Live refresh | announcement/no focus loss |
RTL، ارقام و واحد پول بخشی از صحتاند
محور عددی را بهخاطر RTL معکوس نکنید مگر Scale معنا داشته باشد. Persian/Arabic/Latin digits، decimal separator، minus sign، percent، نیمفاصله و mixed-direction labels را تست کنید. مقدار مالی canonical IRR و مقدار نمایشی تومان را با واحد صریح جدا نگه دارید؛ تبدیل بیبرچسب داده را دهبرابر جابهجا میکند.
Export باید معنای نمودار را حفظ کند
Web، SVG، PNG، PDF، slide، print، email و mobile ممکن است Font، Legend، tooltip، footnote و clipping متفاوت داشته باشند. SVG zoom را بهتر حفظ میکند، ولی semantics و table را خودکار تضمین نمیکند. Export artifact، spec hash، dataset version و viewport را ثبت و هر Surface را جدا بازبینی کنید.
Render Manifest chart/spec/dataset versions: renderer/library/font versions: locale/direction/number format: viewport/DPI/theme: format: HTML | SVG | PNG | PDF content_hash: table/description links: tested surfaces: known differences:
Visual QA خود نمودار را تست میکند
| لایه تست | نمونه |
|---|---|
| Schema | types/required/enum |
| Identity | dedupe/join cardinality |
| Transform | golden rows/reconciliation |
| Metric | formula/denominator/status |
| Encoding | field/channel/scale/domain |
| Render | clipping/font/legend/RTL |
| Accessibility | description/table/keyboard/contrast |
| Export | HTML/SVG/PNG/PDF parity |
| Decision | retrieval/misinterpretation task |
Golden Data از Golden Screenshot مهمتر است
Screenshot diff تغییر پیکسل را میبیند، نه خطای معنایی ثابت را. یک Fixture کوچک با Duplicate، Missing، late event، Blocked و known aggregates بسازید. ابتدا transformed rows و exact values را Assert کنید، سپس spec و render را بسنجید. Snapshot test بدون semantic assertion میتواند نمودار غلطِ پایدار را PASS کند.
آزمایش بازتولیدپذیر: Trend سبز با Evidence نزولی
Fixture کاملاً ساختگی SYN-QA-CHART-CONTRACT-01 سه Snapshot با Planned population متفاوت دارد. همهٔ Countها آشتی میکنند. نمودار ساده فقط Pass/Executed را با محور ۷۵ تا ۱۰۰ نمایش میدهد؛ Chart Contract همان داده را با سه نسبت، Countها، مخرجها و محور ۰ تا ۱۰۰ نگه میدارد.
$ node .post-1831-experiment.js runtime: Node.js v26.7.0 fixture: SYN-QA-CHART-CONTRACT-01 reconciled = true snapshot planned pass fail blocked notRun pass/executed passed/planned completion SYN-C1 100 72 18 4 6 80.0% 72.0% 90.0% SYN-C2 140 63 7 10 60 90.0% 45.0% 50.0% SYN-C3 200 76 4 20 100 95.0% 38.0% 40.0% naive chart findings = 12 missing chart/question/source/population/transforms/status/missingness missing-denominator nonzero-baseline-without-justification colour-only-or-unlabelled-series missing-accessible-data-table + missing-correction-policy naiveChartAudit.decision = HOLD governedChartAudit.findings = [] governedChartAudit.decision = READY_FOR_CHART_REVIEW
Pass/Executed واقعاً بالا میرود؛ Passed/Planned و Completion واقعاً پایین میآیند. تناقض محاسباتی وجود ندارد: مخرجها فرق دارند و Population ثابت نیست. هیچ نسبت بهتنهایی کیفیت، Coverage، Risk یا آمادگی انتشار را ثابت نمیکند. Chart review نیز تصمیم Release نیست.
حدود اعتبار Fixture مصنوعی
- تمام Snapshotها، Testها، Countها، Statusها، Chartها، Domainها و Rules ساختگیاند.
- اعداد عمداً برای نمایش تفاوت مخرج و Population طراحی شدهاند و Sample واقعی نیستند.
- Audit فقط Presence/ساختار چند Field را میسنجد، نه صحت آماری، ادراکی یا دسترسپذیری واقعی.
- محور صفر، نوع نمودار و ۱۲ Check استاندارد جهانی یا Algorithm عمومی نیستند.
- هیچ کاربر، محصول، تیم، Release، کیفیت، Risk، Coverage، هزینه یا Outcome سنجیده نشده است.
READY_FOR_CHART_REVIEWمعادل Publish approval، WCAG conformance یا تصمیم درست نیست.
آزمایشگاه فارسی کاملاً آفلاین
Dataset مصنوعی SYN-CHART-FA-01 را با سه Build، Retry، Duplicate، Blocked، Not Run، Missing، late event و schema change بسازید. دو Transform مستقل تولید کنید، reconciliation را Assert و Bar/Line/Heatmap همراه جدول معادل در viewportهای RTL رندر کنید. شبکه و اتصال Production خاموش باشد.
| Fault | کنترل | Evidence |
|---|---|---|
| Duplicate event | grain/dedupe | row reconciliation |
| Unknown→0 | status contract | missing table |
| Timezone shift | bucket contract | boundary fixture |
| Truncated axis | scale audit | spec snapshot |
| Colour-only | direct label | non-colour review |
| RTL clipping | render matrix | SVG/PNG/PDF |
| Table drift | one transformed view | value parity |
| Late correction | supersede policy | version history |
فقط شناسهها و مقادیر ساختگی استفاده کنید؛ هیچ نام، موبایل، ایمیل، IP، حساب، Order، پرداخت، PAN، CVV2، OTP، Cookie، Token، Secret، Screenshot یا دادهٔ Production وارد نشود. برای مبلغ فرضی canonical IRR و تومان نمایشی را صریح کنید. این Lab ادعای حقوقی، مالی، آماری یا بازار ایران ندارد.
Correction نمودار باید Dataset و Spec را نسخهدار کند
اگر Query، مخرج، Axis، Label یا داده اشتباه بود، نسخهٔ منتشرشده را بیردپا جایگزین نکنید. Correction reason، affected claims/decisions، old/new dataset/query/spec/render hashes و لینک superseding را ثبت کنید. اگر خطا تصمیمی را تغذیه کرده، صاحب تصمیم را مطلع و Decision record را باز کنید.
Chart Correction Record chart/version corrected: detected_at/by: error class + impact: old dataset/query/spec/render hashes: new versions/hashes: affected views/exports/decisions: notification/review: superseded_at + archive link: prevention action/owner/due:
ابزار Visualization حقیقت را خودکار تولید نمیکند
Excel، Power BI، Tableau، Grafana، Vega-Lite، D3 یا کتابخانهٔ Python هرکدام قابلیت و خطر متفاوت دارند. انتخاب باید با data volume، semantic layer، version control، accessibility، export، deployment، skills، cost و exit سنجیده شود. «BI تخصصی همیشه بهتر» و «چند کلیک یعنی دقیق» ادعای معتبری نیست.
AI میتواند Spec پیشنهاد دهد، نه Claim واقعی
AI میتواند نوع View، Label، Alt draft یا test case پیشنهاد کند، اما نباید Field، denominator، missingness، Cause یا decision را حدس بزند. Dataset classification، prompt/output retention، hallucination review، deterministic export، source trace و human approval لازماند.
معیارهای سلامت Chart System
| Signal | Countermetric |
|---|---|
| transform reconciliation pass | semantic blind spots |
| source-to-chart latency | late/invalid data rate |
| table/render exact parity | masked formatting errors |
| accessibility checks | real task failures |
| correction count/time | under-reporting errors |
| decision retrieval success | confident misinterpretation |
| unused charts retired | missing necessary view |
تعداد نمودار، View، Click، رنگ سبز، Export یا applause را KPI سازنده نکنید. هدف کاهش تعداد Correction نیز میتواند خطا را پنهان کند؛ sampled audit و مسیر امن گزارش اشتباه لازم است.
نقشها و حقوق تصمیم
| نقش | مالک | مالک نیست |
|---|---|---|
| Domain/Metric owner | meaning/formula/allowed use | render details |
| Data owner | source/schema/quality/access | business claim |
| Analyst/Chart author | transform/encoding/description | risk acceptance |
| QA/Data tester | fixture/reconciliation/parity | all semantic truth |
| Accessibility reviewer | alternative/task/known limits | metric validity |
| Publisher | surface/version/freshness | silent correction |
| Decision owner | interpretation/action with limits | rewriting evidence |
برنامهٔ ۳۰روزهٔ Pilot
| روز | کار | خروجی |
|---|---|---|
| ۱–۵ | Inventory نمودار/تصمیم/خطا | chart map |
| ۶–۱۰ | تعریف Contract/Manifest/Correction | v0.1 |
| ۱۱–۱۵ | Fixture و transform assertions | golden data |
| ۱۶–۲۰ | render/RTL/accessibility/export matrix | evidence pack |
| ۲۱–۲۵ | Pilot روی سه Chart واقعی کمریسک | task evidence |
| ۲۶–۳۰ | Review خطا/هزینه/فایده | Adopt/Adapt/Stop |
۳۰ ضدالگوی بصریسازی دادههای تست
- شروع از Pie
- عنوان «سلامت پروژه»
- Source بینسخه
- Row grain نامعلوم
- Retry دوبرابرشده
- Join چندبهچند مخفی
- مخرج حذفشده
- Blocked/Not Run حذفشده
- Missing=0
- Mean بدون Distribution
- p95 بدون Support
- Bin خودکار بیثبت
- Timezone بیتعریف
- Trend با Population متغیر بیافشا
- Bar با محور بریده
- Dual axis
- 3D و shadow
- Gauge سبز=آماده
- Heatmap قرمز=کیفیت بد
- Scatter=Cause
- Pie با دستههای زیاد
- Legend دور و رنگمحور
- Alt «نمودار تست»
- Table از Query دیگر
- Tooltip بدون Keyboard
- RTL clipping
- تومان/ریال بیواحد
- Screenshot golden بدون data assertions
- AI-generated claim
- Correction بیردپا
چکلیست ۴۸نقطهای انتشار نمودار
- Chart ID
- Version/status
- Decision question
- Allowed use
- Claim boundary
- Dataset ID
- Source/schema
- Query version
- Spec version
- Facts-as-of
- Grain
- Identity/dedupe
- Population
- Window/timezone
- Fields/types
- Units
- Status vocabulary
- Filters
- Join cardinality
- Formula
- Numerator
- Denominator
- Aggregate/groupby
- Bin/timeUnit
- Missingness
- Late data
- Invalid/exclusion
- Reconciliation
- Mark
- Channels
- Scale/domain
- Baseline
- Sort/stack
- Direct labels
- Annotation source
- Support/uncertainty
- Short description
- Long description
- Equivalent table
- Download schema
- Non-colour meaning
- Contrast/zoom
- Keyboard/focus
- RTL/mobile
- Export parity
- Freshness/owner
- Correction policy
- Known limits/review
جمعبندی: نمودار یک قرارداد تبدیل است
پیش از رنگ و Chart type، سؤال، Claim، Dataset، Grain، Population، Status و Transform را تثبیت کنید. سپس Mark/Scale/Domain/Label/Uncertainty را انتخاب و همان View را با توضیح کوتاه، توضیح بلند و جدول معادل منتشر کنید. Golden data، render matrix، RTL/accessibility/export checks و Correction history نمودار را قابل ممیزی میکنند؛ هیچ Visual بهتنهایی کیفیت، علت یا تصمیم درست را تضمین نمیکند.
سؤالات متداول بصریسازی دادههای تست
برای وضعیت اجرای تست چه نموداری مناسب است؟
برای مقایسهٔ Countهای Passed/Failed/Blocked/Not Run، Bar یا stacked bar همراه Count کل مناسب است؛ برای تغییر در زمان، line/area با Population و Status ثابت یا افشاشده. Pie پیشفرض نیست. جدول معادل و مخرج نسبتها را همیشه نگه دارید.
آیا محور نمودار باید همیشه از صفر شروع شود؟
برای Bar که طول از baseline مقایسه میشود، معمولاً بله. برای Line یا Distribution ممکن است domain محدود با دلیل، برچسب و context مفید باشد. قانون مکانیکی عمومی نیست؛ Chart Contract باید distortion risk، domain و alternative full-range را روشن کند.
تفاوت Bar Chart و Histogram چیست؟
Bar دستههای گسسته با ترتیب قراردادی را مقایسه میکند؛ Histogram مقادیر پیوسته را در Binهای عددی پیوسته خلاصه میکند. Histogram به boundary/width و Missing contract نیاز دارد و تغییر Bin میتواند شکل دیدهشده را عوض کند.
چگونه نمودار QA را دسترسپذیر کنیم؟
معنا را فقط با رنگ Encode نکنید؛ Label مستقیم، contrast/zoom، عنوان و Source بیرون تصویر، توضیح کوتاه، توضیح بلند شامل Values/Scale/Trend/Limits، جدول/Download معادل، reading order و Keyboard/focus را فراهم و در RTL/mobile/PDF با کار واقعی آزمایش کنید.
آیا ابزار BI یا AI نمودار درست را خودکار میسازد؟
ابزار میتواند Transform/Encoding/Render را خودکار کند و AI پیشنهاد بدهد، اما Grain، Population، Oracle معنایی، مخرج، Missingness، Claim و Allowed use نیازمند قرارداد و بازبینیاند. خروجی را با Golden data، table parity، render/accessibility tests و Correction policy کنترل کنید.

