水平堆积条形图显示同一组的多个值
@subarroca我过去曾与几个人谈论过这样的组件——所以我觉得这将是图书馆的一个很好的补充。
在开始实施之前,请先创建一个 API 提案。
最初的想法和问题:
我们过去面临的主要挑战是,它需要以一种连接的方式工作(例如,在表格列中)。
这里的挑战是特定指标应该在所有连接的实例中获得相同的颜色,即
第 1 行显示:metricA 蓝色、metricB 红色、metricC 黄色
第 2 行显示:metricA 蓝色,metricC 黄色
这有点违背我们当前的图表着色系统,这就是为什么我们仍然遇到这个问题的原因。
也许我们需要让开发人员以相同的方式为行中的相同指标着色。 简单用例和连接用例的自动着色,需要在系列上设置颜色。
<dt-single-stacked-bar
[series]="series"
[selected]="selected"
(selectedChange)="onSelect($event)"
valueDisplayMode="percent"
[visibleLegend]="false"
>
<div dtSingleStackedBarOverlay>...</div>
</dt-single-stacked-bar>
DtChartValueMode.ABSOLUTE
DtSingleStackedBarNode
interface DtSingleStackedBarNode {
label: string;
value: number;
color?: DtColors | string;
}
export enum DtChartValueMode {
ABSOLUTE = 'absolute',
PERCENT = 'percent',
}
嗨@subarroca!
到目前为止,API 提案看起来不错。 我想讨论几件事。
visibleLegend: boolean 是否显示图例。 默认值:真
我认为我们应该考虑将 SingleStackedBarChart 连接到 dt-legend 并让消费者定义要呈现图例的位置。 我正在考虑表格行中 SingleStackedBarChart 的用例,在表格本身的末尾,它显示了图表的图例。
然而,这会导致图表之间进行必要的通信,以同步它们的系列和颜色,如https://github.com/dynatrace-oss/barista/issues/884#issuecomment -614602707 中所述。 一种解决方法是不让系列不自动遵循图表颜色,而是让用户定义图表颜色。
value 要在图表中表示的绝对或相对数字
请使用联合类型'percent' | 'absolute'
作为值而不是枚举。
嗨@tomheller! 我对提案进行了一些更改,以使其更适合。
我正在使用DtSingleStackedBarChartValueDisplayMode
这是
export type DtSingleStackedBarChartValueDisplayMode =
| 'none'
| 'absolute'
| 'percent';
这对你有用还是你不喜欢这种类型?
此外,我还添加了selectable
,因为并非在每种情况下您都希望将其用作可选图表。
颜色是使用getDtChartColorPalette
自动获取的,但如果任何节点有颜色,它只会覆盖分配的颜色。
关于图例的使用。 我已经把它放在模板中了。 我是否需要连接它或以某种方式公开图例?
这对你有用还是你不喜欢这种类型?
这对我来说非常有效,:+1:
我还添加了可选择的,因为并非在每种情况下您都想将其用作可选择的图表。
这也适用于我,您能否也反映您评论中的更改,所以我们在这里有一个最新的单一来源https://github.com/dynatrace-oss/barista/issues/884#issuecomment -614605963
关于图例的使用。 我已经把它放在模板中了。 我是否需要连接它或以某种方式公开图例?
我试图说明的是,多个图表可以共享一个图例。 这就是为什么我认为我们不能将图例嵌入图表本身,但需要做这样的事情。 想象一个表或任何其他类型的重复数据表示,其中行在语义上是连接的。
<dt-dummy-table>
<dt-dummy-row *ngFor="let row of rows">
<dt-single-stacked-bar [series]="row.series" legend="dummyTableLegend">
</dt-single-stacked-bar>
</dt-dummy-row>
</dt-dummy-table>
<dt-single-stacked-bar-legend #dummyTableLegend>
<!-- ... ? -->
</dt-single-stacked-bar-legend>
这样,您就不想在每一行中呈现图例,而是在表格的末尾,收集所有系列点并显示它们的图标和标签。
这就是为什么不可能按图表自动提取图表颜色的原因,因为它们需要在同一系列的表中的所有图表中具有相同的颜色。 即使,例如在第 7 行,缺少一个系列。
我希望这是可以理解的?
是的,完全可以理解。 我以为您想与图例交互并隐藏或显示图表中的元素。
一会儿我会更新定义
<dt-single-stacked-bar
[series]="series"
[selected]="selected"
(selectedChange)="onSelect($event)"
valueDisplayMode="percent"
[visibleLegend]="false"
>
<div dtSingleStackedBarOverlay>...</div>
</dt-single-stacked-bar>
none
DtSingleStackedBarChartNode
interface DtSingleStackedBarChartNode {
label: string;
value: number;
color?: DtColors | string;
}
export type DtSingleStackedBarChartValueDisplayMode =
| 'none'
| 'absolute'
| 'percent';
也许,如果我们考虑连接多个单堆叠条形图,类似max
的输入会有所帮助。 如果没有给出,您可以将最大值计算为遍数系列的总和,但如果您有多个,您可能希望它们具有相同的比例以进行比较。
这个和外部的传说可能不是我们需要立即解决的问题,因为我认为这可以作为一个选项在之后进行扩展,而无需进行重大更改。
在提出建议并考虑到这个组件可以在多个系列中重复使用后,我决定升级它,不再称它为single
。 单身只是一个例子。
<dt-stacked-bar
[series]="series"
[selectable]="selectable"
[(selected)]="selected"
[valueDisplayMode]="valueDisplayMode"
[direction]="direction"
[labelPosition]="labelPosition"
[legendPosition]="legendPosition"
[legends]="legends"
[fillMode]="fillMode"
[maxBarSize]="maxBarSize"
[max]="max"
>
<ng-template dtStackedBarChartOverlay let-tooltip>
<strong>{{ tooltip.seriesOrigin.label }}</strong>
<div>{{ tooltip.origin.label }}: {{ tooltip.origin.value }}</div>
</ng-template>
</dt-stacked-bar>
none
top
bottom
DtStackedBarChartSeries
和DtStackedBarChartNode
interface DtStackedBarChartSeries {
label: string;
nodes: DtStackedBarChartNode[];
}
interface DtStackedBarChartNode {
label: string;
value: number;
color?: DtColors | string;
}
interface DtStackedBarChartTooltipData {
origin: DtStackedBarChartNode;
seriesOrigin: DtStackedBarChartSeries;
valueRelative: number;
color: DtColors | string;
visible: boolean;
selected: boolean;
length?: string;
}
series
数组中传递的源节点type DtStackedBarChartValueDisplayMode = 'none' | 'absolute' | 'percent';
type DtStackedBarChartElementPosition =
| 'none'
| 'top'
| 'right'
| 'bottom'
| 'left';
type DtStackedBarChartFillMode = 'full' | 'relative';
type DtStackedBarChartDirection = 'horizontal' | 'vertical';
嗨@subarroca!
这是扩展条形图的巨大努力。 有几点需要考虑:
条形水平/垂直与条形图和柱形图
在图表中,垂直条形图通常被称为柱形图。 我不确定我们是否想偏离这个标准。 我会选择创建两个组件dt-stacked-column-chart
和dt-stacked-bar-chart
,它们可以通过基类共享大部分内部逻辑,即DtStackedBarColumnChartBase
。
选择器
请在选择器中包含“图表”一词,以明确组件将代表什么。
方向输入
如果我们将它们分成两个组件,则可能不再需要。
labelPosition: DtStackedBarChartElementPosition
也许我们可以找到一种既适合又适合柱形图和条形图的类型。 由于左/右在柱形图和顶部/底部与条形图上没有多大意义,也许我们可以使用类似start | end
的东西?
legendPosition: DtStackedBarChartElementPosition
我会选择在当前级别删除它并为图例提供固定位置。 我目前看不到任何好处或用例来定义职位。 截至目前,我们所有的条形图/柱形图图例都在图表下方。
maxBarSize: 数字
我猜这是指单个列/条的最大宽度。也许我们可以找到一种方法在列和条之间用另一个名称共享它,即maxTrackSize
。
API 提案不包括任何关于轴、轴标签、刻度和大小的内容。 我想我们可以在稍后的额外步骤中做到这一点。
由于这似乎是一个非常大的组件,我想将其拆分并定义一个最小可行产品以开始使用是可行的。 否则,我认为这需要相当长的时间。 你对这个@ffriedl89 @subarroca有什么看法?
你好!
首先,我建议的所有内容都已经完成,因此除了测试之外不需要太多时间
选择器
它的名称中已经有“图表”,但我在这里忘记了,感谢您的注意
关于条形图/柱形图
事实上,它已经在一个带有一个模板的组件中完成,并使用了网格布局和元素定位,所以我不会采用单独的组件方法。 我可以将direction
命名更改为type: 'bar' | 'column'
标签位置
当向 UX 展示一些试验时,他们建议标签可以放在条形图的左侧,所以我有顶部、底部和左侧,而右侧似乎只是完成了图片,尽管我不认为它会有多大用处。 我会和他们谈谈,看看我们是否可以摆脱左右
图例位置
易于拆卸
最大条形尺寸
这正是您所描述的,如果我们将命名更改为bar|column
,按照您的建议重命名它是有意义的
轴
我有一个用于柱形图的工作 x 轴线。 我认为我们应该以某种方式添加一个“valueAxis”,但我认为对于接下来的阶段来说,这已经远远超出了它的原始限制,并且可以轻松添加
由 #988 关闭