渐变版本

没有渐变,似乎总少点什么,可不可以来点渐变。假如上渐变的话,需要改变一下思路,这个思路更加优秀,绘制的数量更少。对于这种间隔,我们通过 clearRect 清楚即可。

现在都是确定高度,然后以全局高度减去矩形高度为坐标 y,画完的小方块刚好以底部对齐。

show me code

数据可视化(下) - 图1

  1. let widthSize = 20
  2. let GreenHightArray = new Array(widthSize + 1).fill(height)
  3. let v = (h + margin) * 3
  4. let maxSize = 20
  5. function Run() {
  6. ctx.clearRect(0, 0, width, height)
  7. for (let j = 0; j <= widthSize; j++) {
  8. let ramdom = 255 * Math.random()
  9. currentSize = Math.ceil((ramdom / 255) * maxSize)
  10. ctx.fillStyle = 'red'
  11. ctx.fillRect(
  12. j * w + margin * j,
  13. height - h * currentSize,
  14. w,
  15. h * currentSize
  16. )
  17. }
  18. setTimeout(Run, 500)
  19. }
  20. Run()

添加渐变样式

  1. let g = ctx.createLinearGradient(0, height, 0, 0)
  2. g.addColorStop(0, '#283149')
  3. g.addColorStop(0.3, '#ff7a5c')
  4. g.addColorStop(0.6, '#c93d1b')
  5. ctx.fillStyle = g

添加小绿块

数据可视化(下) - 图2

  1. function Run() {
  2. ctx.clearRect(0, 0, width, height)
  3. for (let j = 0; j <= widthSize; j++) {
  4. let ramdom = 255 * Math.random()
  5. currentSize = Math.ceil((ramdom / 255) * maxSize)
  6. let g = ctx.createLinearGradient(0, height, 0, 0)
  7. g.addColorStop(0, '#283149')
  8. g.addColorStop(0.3, '#ff7a5c')
  9. g.addColorStop(0.6, '#c93d1b')
  10. ctx.fillStyle = g
  11. ctx.fillRect(
  12. j * w + margin * j,
  13. height - h * currentSize,
  14. w,
  15. h * currentSize
  16. )
  17. // 绿块逻辑
  18. ctx.fillStyle = 'green'
  19. currentGreenHight = height - currentSize * h // 制高点 y 坐标。
  20. if (GreenHightArray[j] + v > currentGreenHight) {
  21. GreenHightArray[j] = currentGreenHight
  22. console.log(j)
  23. ctx.fillRect(j * w + margin * j, GreenHightArray[j], w, h)
  24. } else {
  25. GreenHightArray[j] += v
  26. ctx.fillRect(j * w + margin * j, GreenHightArray[j], w, h)
  27. }
  28. }
  29. setTimeout(Run, 500)
  30. }
  31. Run()

分割网格

数据可视化(下) - 图3

  1. let widthSize = 20
  2. let GreenHightArray = new Array(widthSize + 1).fill(height)
  3. let v = (h + margin) * 2 // 下降速度
  4. let maxSize = 30 // -> 255
  5. let lines = Math.ceil(height / (h + margin)) // 计算行数
  6. function Run() {
  7. ctx.clearRect(0, 0, width, height)
  8. for (let j = 0; j <= widthSize; j++) {
  9. let ramdom = 255 * Math.random()
  10. currentSize = Math.ceil((ramdom / 255) * maxSize)
  11. let g = ctx.createLinearGradient(0, height, 0, 0)
  12. g.addColorStop(0, '#283149')
  13. g.addColorStop(0.3, '#ff7a5c')
  14. g.addColorStop(0.6, '#c93d1b')
  15. ctx.fillStyle = g
  16. ctx.fillRect(
  17. j * w + margin * j,
  18. height - h * currentSize,
  19. w,
  20. h * currentSize
  21. )
  22. // 绿块逻辑
  23. ctx.fillStyle = 'green'
  24. currentGreenHight = height - currentSize * h // 制高点 y 坐标。
  25. if (GreenHightArray[j] > currentGreenHight) {
  26. GreenHightArray[j] = currentGreenHight
  27. ctx.fillRect(j * w + margin * j, GreenHightArray[j], w, h)
  28. } else {
  29. GreenHightArray[j] += v
  30. ctx.fillRect(j * w + margin * j, GreenHightArray[j], w, h)
  31. }
  32. }
  33. for (var i = 0; i <= lines; i++) {
  34. ctx.clearRect(0, height - i * h, width, margin)
  35. }
  36. setTimeout(Run, 500)
  37. }
  38. Run()

上面切割的不准确,说明某处的 margin 没加上。仔细检查,现在所有的块绘制的高度都是 h + margin,然后用 clearRect 进行切割。

数据可视化(下) - 图4

  1. let w = 20
  2. let h = 10
  3. let margin = 2 // 间隔
  4. // let GreenHight = height
  5. let widthSize = 20
  6. let GreenHightArray = new Array(widthSize + 1).fill(height)
  7. let v = (h + margin) * 3 // 下降速度
  8. let maxSize = 24 // -> 255
  9. let lines = Math.ceil(height / (h + margin)) // 计算行数
  10. function Run() {
  11. ctx.clearRect(0, 0, width, height)
  12. for (let j = 0; j <= widthSize; j++) {
  13. let ramdom = 255 * Math.random()
  14. currentSize = Math.ceil((ramdom / 255) * maxSize)
  15. let g = ctx.createLinearGradient(0, height, 0, 0)
  16. g.addColorStop(0, '#233142')
  17. g.addColorStop(0.6, '#455d7a')
  18. g.addColorStop(0.8, '#f95959')
  19. ctx.fillStyle = g
  20. ctx.fillRect(
  21. j * w + margin * j,
  22. height - (h + margin) * currentSize,
  23. w,
  24. (h + margin) * currentSize
  25. )
  26. // 绿块逻辑
  27. ctx.fillStyle = 'green'
  28. currentGreenHight = height - currentSize * (h + margin) // 制高点 y 坐标。
  29. if (GreenHightArray[j] + v > currentGreenHight) {
  30. GreenHightArray[j] = currentGreenHight
  31. ctx.fillRect(j * w + margin * j, GreenHightArray[j], w, h + margin)
  32. } else {
  33. GreenHightArray[j] += v
  34. ctx.fillRect(j * w + margin * j, GreenHightArray[j], w, h + margin)
  35. }
  36. }
  37. for (var i = 0; i <= lines; i++) {
  38. ctx.clearRect(0, height - i * (h + margin), width, margin)
  39. }
  40. setTimeout(Run, 500)
  41. }
  42. Run()