Blazor ChartJs:将栏扩展到 canvas 的末尾
Blazor ChartJs: Expanding bar to the end of the canvas
使用 Blazor.ChartJs 库,我有一系列水平堆积条形图,目的是显示完成百分比。红色部分是年度目标,蓝色部分是目前实际达到的数字:
第一个图表的目标可能是 10,000,000 美元,第二个是 3,000,000 美元,第三个是 7,000,000 美元,等等。但是我希望每个图表都扩展到包含它的 table 单元格的末尾,因为我不关心数字,只关心百分比:
正如您在第一个图表中看到的那样,数字在单元格末尾之前停止。我正在将图表添加到 HTML table 个单元格,每个单元格对应我跟踪的每个统计数据:
<table>
<tbody>
<tr>
<td></td>
<td>% Complete</td>
</tr>
@for (int i = 0; i < typeOfProject.Count; i++)
{
<tr>
<td><Chart Config="_configs[i]" Height="8" /></td>
<td>@String.Format("{0:P0}", percentagesComplete[i])</td>
</tr>
}
</tbody>
</table>
我使用 returns BarConfig 选项的方法构建 _configs 集合,所有图表的配置都相同。我已经尝试过 Responsive 和 MaintainAspectRatio 属性,但这似乎不会影响结果。
config = new BarConfig
{
Options = new BarOptions
{
MaintainAspectRatio = true,
Responsive = true,
Legend = new Legend
{
Display = false
},
Scales = new BarScales
{
XAxes = new List<CartesianAxis>
{
new BarLinearCartesianAxis
{
Stacked = true,
OffsetGridLines = false,
Offset = false,
Display = AxisDisplay.False
}
},
YAxes = new List<CartesianAxis>
{
new BarCategoryAxis
{
Stacked = true,
OffsetGridLines = false,
Offset = false,
Display = AxisDisplay.False,
BarThickness = 45
}
}
}
}
我还在 中提到的每个单元格中的 Canvas 对象周围添加了一个 div 标记,但这不是我的问题的解决方案。
如何将条形扩展到每个单元格中 canvas 的末尾?
我创建了自己的代码来执行此操作,因为我无法使图表宽度始终扩展到 table 单元格的末尾。要求也略有变化,所以我需要绘制一个代表 100% 目标的空矩形,然后用目标完成程度的百分比填充矩形。
首先,我有一个 JavaScript 方法获取 canvas 的宽度,根据该宽度和“值”变量(百分比)计算要绘制的像素数,然后使用上下文首先绘制一个清晰的矩形。它绘制了一个表示目标进度的填充矩形:
function buildCanvas(canvasId, value) {
var canvasWidth = document.getElementById(canvasId).offsetWidth;
var calculatedWidth = parseInt(canvasWidth * value);
var canvasToDraw = document.querySelector('#' + canvasId);
const ctx1 = canvasToDraw.getContext('2d');
ctx1.clearRect(0, 0, 300, 150);
ctx1.fillStyle = 'rgba(173, 116, 76, 1.0)';
ctx1.fillRect(0, 0, calculatedWidth, 150);
}
我定义要绘制的图表:
<canvas id="chart" style="border: 1px solid #AD744C; height: 18px; width: 300px">
然后我注入 IJSRuntime 并调用 JavaScript 方法来绘制矩形,该值是目标值除以该值得到的百分比:
@inject IJSRuntime JsRuntime
...
JsRuntime.InvokeAsync<string>("buildCanvas", $"chart", $"{value}");
使用 Blazor.ChartJs 库,我有一系列水平堆积条形图,目的是显示完成百分比。红色部分是年度目标,蓝色部分是目前实际达到的数字:
第一个图表的目标可能是 10,000,000 美元,第二个是 3,000,000 美元,第三个是 7,000,000 美元,等等。但是我希望每个图表都扩展到包含它的 table 单元格的末尾,因为我不关心数字,只关心百分比:
正如您在第一个图表中看到的那样,数字在单元格末尾之前停止。我正在将图表添加到 HTML table 个单元格,每个单元格对应我跟踪的每个统计数据:
<table>
<tbody>
<tr>
<td></td>
<td>% Complete</td>
</tr>
@for (int i = 0; i < typeOfProject.Count; i++)
{
<tr>
<td><Chart Config="_configs[i]" Height="8" /></td>
<td>@String.Format("{0:P0}", percentagesComplete[i])</td>
</tr>
}
</tbody>
</table>
我使用 returns BarConfig 选项的方法构建 _configs 集合,所有图表的配置都相同。我已经尝试过 Responsive 和 MaintainAspectRatio 属性,但这似乎不会影响结果。
config = new BarConfig
{
Options = new BarOptions
{
MaintainAspectRatio = true,
Responsive = true,
Legend = new Legend
{
Display = false
},
Scales = new BarScales
{
XAxes = new List<CartesianAxis>
{
new BarLinearCartesianAxis
{
Stacked = true,
OffsetGridLines = false,
Offset = false,
Display = AxisDisplay.False
}
},
YAxes = new List<CartesianAxis>
{
new BarCategoryAxis
{
Stacked = true,
OffsetGridLines = false,
Offset = false,
Display = AxisDisplay.False,
BarThickness = 45
}
}
}
}
我还在
如何将条形扩展到每个单元格中 canvas 的末尾?
我创建了自己的代码来执行此操作,因为我无法使图表宽度始终扩展到 table 单元格的末尾。要求也略有变化,所以我需要绘制一个代表 100% 目标的空矩形,然后用目标完成程度的百分比填充矩形。
首先,我有一个 JavaScript 方法获取 canvas 的宽度,根据该宽度和“值”变量(百分比)计算要绘制的像素数,然后使用上下文首先绘制一个清晰的矩形。它绘制了一个表示目标进度的填充矩形:
function buildCanvas(canvasId, value) {
var canvasWidth = document.getElementById(canvasId).offsetWidth;
var calculatedWidth = parseInt(canvasWidth * value);
var canvasToDraw = document.querySelector('#' + canvasId);
const ctx1 = canvasToDraw.getContext('2d');
ctx1.clearRect(0, 0, 300, 150);
ctx1.fillStyle = 'rgba(173, 116, 76, 1.0)';
ctx1.fillRect(0, 0, calculatedWidth, 150);
}
我定义要绘制的图表:
<canvas id="chart" style="border: 1px solid #AD744C; height: 18px; width: 300px">
然后我注入 IJSRuntime 并调用 JavaScript 方法来绘制矩形,该值是目标值除以该值得到的百分比:
@inject IJSRuntime JsRuntime
...
JsRuntime.InvokeAsync<string>("buildCanvas", $"chart", $"{value}");