Python의 imshow ()와 비슷한 시각화를 JavaScript로 수행
11407 단어 ReactHTML캔버스자바스크립트matplotlib
배경
1. React를 사용하는 경우
1.1. 구현
시각화하고 싶은 배열과 칼라 스케일을 props
로서 주는 것으로 묘화를 실시하는 컴퍼넌트를 구현한다. 내부에서는 canvas의 ImageData 객체를 이용해 픽셀을 조작하고 있다.
Imshow.jsximport React from "react";
import * as d3 from "d3";
export default class Imshow extends React.Component {
componentDidMount() {
this.imshow();
}
componentDidUpdate(prevProps) {
if ( (this.props.data!==prevProps.data) || (this.props.interpolate!==prevProps.interpolate) ) {
this.imshow();
}
}
imshow = () => {
const canvas = this.refs.canvas;
// Square only
const resolution = Math.sqrt(this.props.data.length);
["width", "height"].forEach(a => canvas.setAttribute(a, resolution));
const context = canvas.getContext("2d");
const imageData = context.createImageData(resolution, resolution);
this.props.data.forEach((d, i) => {
let color = isNaN(d) ? {r: 0, g: 0, b: 0} : d3.color(this.props.interpolate(d));
imageData.data[i*4 ] = color.r;
imageData.data[i*4+1] = color.g;
imageData.data[i*4+2] = color.b;
imageData.data[i*4+3] = 255;
});
context.putImageData(imageData, 0, 0);
}
render() {
return (
<canvas style={{ width: "100%", height: "100%" }} ref="canvas" />
);
}
}
1.2. 예
복소 대수 함수의 Domain Coloring이나 후지산의 고도에 이용하면 다음과 같다.
소스 코드는 GitHub에 있다(복소 로그 함수 , 후지산 )가, 데이터마저 준비 할 수 있으면 이하와 같은 느낌으로 사용할 수 있다.
<Imshow data={this.state.imshowData} interpolate={this.state.colorScale}/>
1.3. 주의점
위의 구현에서,
import React from "react";
import * as d3 from "d3";
export default class Imshow extends React.Component {
componentDidMount() {
this.imshow();
}
componentDidUpdate(prevProps) {
if ( (this.props.data!==prevProps.data) || (this.props.interpolate!==prevProps.interpolate) ) {
this.imshow();
}
}
imshow = () => {
const canvas = this.refs.canvas;
// Square only
const resolution = Math.sqrt(this.props.data.length);
["width", "height"].forEach(a => canvas.setAttribute(a, resolution));
const context = canvas.getContext("2d");
const imageData = context.createImageData(resolution, resolution);
this.props.data.forEach((d, i) => {
let color = isNaN(d) ? {r: 0, g: 0, b: 0} : d3.color(this.props.interpolate(d));
imageData.data[i*4 ] = color.r;
imageData.data[i*4+1] = color.g;
imageData.data[i*4+2] = color.b;
imageData.data[i*4+3] = 255;
});
context.putImageData(imageData, 0, 0);
}
render() {
return (
<canvas style={{ width: "100%", height: "100%" }} ref="canvas" />
);
}
}
<Imshow data={this.state.imshowData} interpolate={this.state.colorScale}/>
props.data
은 1 차원 배열이며, 정사각형의 시각화에 한정한다 (따라서 요소수는 자연수의 제곱인 전제)d
을 시각화하고 싶으면 [].concat.apply([], d)
로 1 차원으로 변환 할 수 있습니다 width
, height
를 100 %로 설정했기 때문에 화면의 픽셀 수는 부모 요소에 의해 정의됩니다 props.interpolate
은 props.data
의 값을 색상으로 변환하는 함수d3.js의 컬러 스케일 사용하기 쉽지만, 이것은 인수가 0-1이라고 가정하기 때문에 적절하게 스케일을 조정합니다
라는 점에 주의. 확장이 필요한 경우 쉽게 구현할 수 있어야 합니다.
2. React를 사용하지 않는 경우
요컨대 canvas 요소의 픽셀치를 지정하고 있을 뿐이므로, 「React 를 사용하는 경우」의 imshow()
내와 거의 같다. 소스 코드는 생략하지만, this.props.***
를 변수로 바꾸거나 this.refs.canvas
를 document.getElementBy***
와 같이 하면 된다고 생각한다.
Reference
이 문제에 관하여(Python의 imshow ()와 비슷한 시각화를 JavaScript로 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sw1227/items/f08cd25364fbaea07792
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Python의 imshow ()와 비슷한 시각화를 JavaScript로 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sw1227/items/f08cd25364fbaea07792텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)