JSFiddle - React, Tailwind, and code Playground
by cooper081
HTML
<body>
</body>
CSS
.x {
font-size:8pt;
/* transform: rotate(45deg); */
text-align: center;
}
div.tooltip-donut {
position: absolute;
text-align: center;
padding: .5rem;
background: #FFFFFF;
color: #313639;
border: 1px solid #313639;
border-radius: 8px;
pointer-events: none;
font-size: 1.3rem;
}
JavaScript
const ary = [{
value: 900,
name: '2022-01-01'
},
{
value: 900,
name: '2022-01-01'
},
{
value: 291,
name: '2022-01-02'
}, {
value: 874,
name: '2022-01-03'
},
{
value: 291,
name: '2022-01-04'
}
];
const width = 600,
height = 200,
line_Color = "red",
line_Width = 1;
// 坐標軸位移
const coordinate_Transfer = Math.max(...ary.map(el => {
return el.value
})).toString().length * 12
// 處理X軸日期格式
const parseTime = d3.timeFormat('%m/%d')
const newData = ary.map(data => parseTime(new Date(data.name)))
// Y座標格式
const scaleY = d3.scaleLinear()
.domain([0, d3.max(ary.map(el => el.value))])
.range([height - 50, 0])
// X座標格式,處理渲染 日期
const scaleX_ScalePoint = d3.scalePoint()
.domain(newData)
.range([coordinate_Transfer, width - 30])
// X座標格式,處理渲染 線圖
const scaleX_ScaleLinear = d3.scaleLinear()
.domain([0, ary.length - 1])
.range([coordinate_Transfer, width - 30])
//創建 SVG conatiner
const svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height)
// 處理坐標軸
function coordinate() {
const axisX = d3.axisBottom(scaleX_ScalePoint).tickValues(scaleX_ScalePoint.domain().filter((d, i) => i % 2 === 0))
const axisY = d3.axisLeft(scaleY).ticks()
.tickFormat(function(d) {
return d == 0 ? d : d / 1000 + "k";
});
svg
.append("g")
.attr("transform", `translate(${coordinate_Transfer},10)`)
.call(axisY)
svg
.append("g")
.attr("transform", `translate(0,160)`)
.call(axisX)
.selectAll("text")
.style("text-anchor", "end")
.attr("dx", "-.8em")
.attr("dy", ".15em")
.attr("transform", "rotate(-45)");
}
var div = d3.select("body").append("div")
.attr("class", "tooltip-donut")
.style("opacity", 0);
const xx = svg.selectAll("circle")
.data(ary)
.join("circle")
.attr("cx", (d, i) => {
console.log("123")
console.log(scaleX_ScaleLinear(i), i)
return scaleX_ScaleLinear(i)
})
.attr("cy", (d, i) => {
return...