- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在试图找出正确的设置来拥有一个具有固定 Canvas 高度但允许宽度溢出x的ChartJS条形图时遇到了麻烦。我在这里找到了一个例子... http://jsfiddle.net/mbhavfwm/它使用 ChartJS 1.0,但我使用的是 ChartJS 2.6。所以,我在这里找到了另一个例子http://jsfiddle.net/jmpxgufu/它使用 ChartJS 2,但此示例显示仅使用几个值渲染的图表,然后使用 javascript 添加更多值,这会导致宽度溢出。不太一样。
我的问题是我无法弄清楚如何使图表在其中包含所有数据的情况下以固定高度渲染,但不尝试将 Canvas 限制为父容器的宽度。我希望它溢出。
这是我到目前为止所拥有的。 https://jsfiddle.net/fed79b7t/
HTML
<div class="chartWrapper">
<div class="chartAreaWrapper">
<canvas id="chart-FuelSpend" height="300" width="1200"></canvas>
</div>
<canvas id="axis-FuelSpend" height="300" width="0"></canvas>
</div>
CSS
.chartWrapper {
position: relative;
}
.chartWrapper > canvas {
position: absolute;
left: 0;
top: 0;
pointer-events: none;
}
.chartAreaWrapper {
width: 600px;
overflow-x: scroll;
}
JAVASCRIPT
function generateLabels() {
var chartLabels = [];
for (x = 0; x < 100; x++) {
chartLabels.push("Label" + x);
}
return chartLabels;
}
function generateData() {
var chartData = [];
for (x = 0; x < 100; x++) {
chartData.push(Math.floor((Math.random() * 100) + 1));
}
return chartData;
}
var chartData = {
labels: generateLabels(),
datasets: [{
label: "Test Data Set",
data: generateData()
}]
};
$(function() {
var canvasFuelSpend = $('#chart-FuelSpend');
var chartFuelSpend = new Chart(canvasFuelSpend, {
type: 'bar',
data: chartData,
maintainAspectRatio: false,
responsive: true,
options: {
tooltips: {
titleFontSize: 0,
titleMarginBottom: 0,
bodyFontSize: 12
},
legend: {
display: false
},
scales: {
xAxes: [{
ticks: {
fontSize: 12,
display: false
}
}],
yAxes: [{
ticks: {
fontSize: 12,
beginAtZero: true
}
}]
},
animation: {
onComplete: function() {
var sourceCanvas = chartFuelSpend.chart.canvas;
var copyWidth = chartFuelSpend.scales['y-axis-0'].width - 10;
var copyHeight = chartFuelSpend.scales['y-axis-0'].height + chartFuelSpend.scales['y-axis-0'].top + 10;
var targetCtx = document.getElementById("axis-FuelSpend").getContext("2d");
targetCtx.canvas.width = copyWidth;
targetCtx.drawImage(sourceCanvas, 0, 0, copyWidth, copyHeight, 0, 0, copyWidth, copyHeight);
}
}
}
});
});
所以,我的目标是让图表具有 Canvas 宽度定义的完整 1200 像素,但容器 div 仅显示 600 像素量,我可以滚动容器以查看图表的其余部分,同时保持Y 轴就位。
任何人都可以阐明我做错了什么吗?我错过了什么?
谢谢!!!!
最佳答案
这似乎与您在 Canvas 周围缺少包装器有关。这是你的 fiddle 的更新版本。我添加了一个名为 addData
的函数
,它接受您要添加的新条目的数量以及 chart
变量。它并没有想象的那么好(因为我不是 100% 确定你想如何添加新数据),但它是一个很好的起点。诀窍是不要初始化包含所有数据
的图表
,您想要创建图表
,然后添加到它以扩展 Canvas ,否则初始渲染将适合该宽度
的所有数据
。
https://jsfiddle.net/qmqmg82z/3/
其他 JavaScript 代码:
function addData(numData, chart){
for (var i = 0; i < numData; i++){
chart.data.datasets[0].data.push(Math.random() * 100);
chart.data.labels.push("Label" + i);
var newwidth = $('.chartAreaWrapper2').width() +60;
$('.chartAreaWrapper2').width(newwidth);
}
}
然后在页面加载函数的末尾(或您想要添加新数据的任何位置)添加此函数调用:
addData(5, chartFuelSpend);
但请记住,这将需要您想要添加的数据和图表
实例。
和 HTML:
<div class="chartWrapper">
<div class="chartAreaWrapper">
<div class="chartAreaWrapper2">
<canvas id="chart-FuelSpend" height="300" width="1200"></canvas>
</div>
</div>
<canvas id="axis-FuelSpend" height="300" width="0"></canvas>
</div>
我猜问题是因为您所拥有的单个包装器的宽度
随着图表
而变化,这意味着水平滚动没有变化应用后,外部包装器具有固定的宽度
,而内部包装器和 Canvas 可以扩展。
关于javascript - ChartJS 2.6 - 条形图固定高度可滚动-X,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44724937/
问题故障解决记录 -- Java RMI Connection refused to host: x.x.x.x .... 在学习JavaRMI时,我遇到了以下情况 问题原因:可
我正在玩 Rank-N-type 并尝试输入 x x .但我发现这两个函数可以以相同的方式输入,这很不直观。 f :: (forall a b. a -> b) -> c f x = x x g ::
这个问题已经有答案了: How do you compare two version Strings in Java? (31 个回答) 已关闭 8 年前。 有谁知道如何在Java中比较两个版本字符串
这个问题已经有答案了: How do the post increment (i++) and pre increment (++i) operators work in Java? (14 个回答)
下面是带有 -n 和 -r 选项的 netstat 命令的输出,其中目标字段显示压缩地址 (127.1/16)。我想知道 netstat 命令是否有任何方法或选项可以显示整个目标 IP (127.1.
我知道要证明 : (¬ ∀ x, p x) → (∃ x, ¬ p x) 证明是: theorem : (¬ ∀ x, p x) → (∃ x, ¬ p x) := begin intro n
x * x 如何通过将其存储在“auto 变量”中来更改?我认为它应该仍然是相同的,并且我的测试表明类型、大小和值显然都是相同的。 但即使 x * x == (xx = x * x) 也是错误的。什么
假设,我们这样表达: someIQueryable.Where(x => x.SomeBoolProperty) someIQueryable.Where(x => !x.SomeBoolProper
我有一个字符串 1234X5678 我使用这个正则表达式来匹配模式 .X|..X|X. 我得到了 34X 问题是为什么我没有得到 4X 或 X5? 为什么正则表达式选择执行第二种模式? 最佳答案 这里
我的一个 friend 在面试时遇到了这个问题 找到使该函数返回真值的 x 值 function f(x) { return (x++ !== x) && (x++ === x); } 面试官
这个问题在这里已经有了答案: 10年前关闭。 Possible Duplicate: Isn't it easier to work with foo when it is represented b
我是 android 的新手,我一直在练习开发一个针对 2.2 版本的应用程序,我需要帮助了解如何将我的应用程序扩展到其他版本,即 1.x、2.3.x、3 .x 和 4.x.x,以及一些针对屏幕分辨率
为什么案例 1 给我们 :error: TypeError: x is undefined on line... //case 1 var x; x.push(x); console.log(x);
代码优先: # CASE 01 def test1(x): x += x print x l = [100] test1(l) print l CASE01 输出: [100, 100
我正在努力温习我的大计算。如果我有将所有项目移至 'i' 2 个空格右侧的函数,我有一个如下所示的公式: (n -1) + (n - 2) + (n - 3) ... (n - n) 第一次迭代我必须
给定 IP 字符串(如 x.x.x.x/x),我如何或将如何计算 IP 的范围最常见的情况可能是 198.162.1.1/24但可以是任何东西,因为法律允许的任何东西。 我要带198.162.1.1/
在我作为初学者努力编写干净的 Javascript 代码时,我最近阅读了 this article当我偶然发现这一段时,关于 JavaScript 中的命名空间: The code at the ve
我正在编写一个脚本,我希望避免污染 DOM 的其余部分,它将是一个用于收集一些基本访问者分析数据的第 3 方脚本。 我通常使用以下内容创建一个伪“命名空间”: var x = x || {}; 我正在
我尝试运行我的test_container_services.py套件,但遇到了以下问题: docker.errors.APIError:500服务器错误:内部服务器错误(“ b'{” message
是否存在这两个 if 语句会产生不同结果的情况? if(x as X != null) { // Do something } if(x is X) { // Do something } 编
我是一名优秀的程序员,十分优秀!