ChartJS 如何在chart-js折线图中为上升趋势指定绿色,为下降趋势指定红色?

qc6wkl3g  于 2022-11-07  发布在  Chart.js
关注(0)|答案(1)|浏览(297)

我想在chart-js中为折线图中的上升趋势分配绿色,在chart-js中为下降趋势分配红色。我对chartjs比较陌生,我不确定如何访问数据元素来发现上升趋势或下降趋势。

  1. import React, { useEffect } from "react";
  2. import {Paper,Grid,Box} from '@mui/material'
  3. import { Line } from "react-chartjs-2";
  4. import {
  5. Chart as ChartJS,
  6. CategoryScale,
  7. LinearScale,
  8. PointElement,
  9. LineElement,
  10. Title,
  11. Tooltip,
  12. Legend,
  13. } from 'chart.js';
  14. import { Button, Typography } from "@mui/material";
  15. ChartJS.register(
  16. CategoryScale,
  17. LinearScale,
  18. PointElement,
  19. LineElement,
  20. Title,
  21. Tooltip,
  22. Legend
  23. );
  24. export default function Nifty50() {
  25. const dataset = [
  26. {
  27. "Close": 17069.1,
  28. "Date": "2022-05-02T10:00:00.000Z",
  29. "High": 17092.25,
  30. "Low": 16917.25,
  31. "Open": 16924.45,
  32. "Volume": 0,
  33. "id": 1
  34. },
  35. {
  36. "Close": 16677.6,
  37. "Date": "2022-05-04T10:00:00.000Z",
  38. "High": 17132.85,
  39. "Low": 16623.95,
  40. "Open": 17096.6,
  41. "Volume": 0,
  42. "id": 2
  43. },
  44. {
  45. "Close": 16682.65,
  46. "Date": "2022-05-05T10:00:00.000Z",
  47. "High": 16945.7,
  48. "Low": 16651.85,
  49. "Open": 16854.75,
  50. "Volume": 0,
  51. "id": 3
  52. },
  53. {
  54. "Close": 16411.25,
  55. "Date": "2022-05-06T10:00:00.000Z",
  56. "High": 16484.2,
  57. "Low": 16340.9,
  58. "Open": 16415.55,
  59. "Volume": 0,
  60. "id": 4
  61. },
  62. {
  63. "Close": 16301.85,
  64. "Date": "2022-05-09T10:00:00.000Z",
  65. "High": 16403.7,
  66. "Low": 16142.1,
  67. "Open": 16227.7,
  68. "Volume": 0,
  69. "id": 5
  70. },
  71. {
  72. "Close": 16240.05,
  73. "Date": "2022-05-10T10:00:00.000Z",
  74. "High": 16404.55,
  75. "Low": 16197.3,
  76. "Open": 16248.9,
  77. "Volume": 0,
  78. "id": 6
  79. },
  80. {
  81. "Close": 16167.1,
  82. "Date": "2022-05-11T10:00:00.000Z",
  83. "High": 16318.75,
  84. "Low": 15992.6,
  85. "Open": 16270.05,
  86. "Volume": 0,
  87. "id": 7
  88. },
  89. {
  90. "Close": 15808,
  91. "Date": "2022-05-12T10:00:00.000Z",
  92. "High": 16041.95,
  93. "Low": 15735.75,
  94. "Open": 16021.1,
  95. "Volume": 0,
  96. "id": 8
  97. },
  98. {
  99. "Close": 15782.15,
  100. "Date": "2022-05-13T10:00:00.000Z",
  101. "High": 16083.6,
  102. "Low": 15740.85,
  103. "Open": 15977,
  104. "Volume": 0,
  105. "id": 9
  106. },
  107. {
  108. "Close": 15842.3,
  109. "Date": "2022-05-16T10:00:00.000Z",
  110. "High": 15977.95,
  111. "Low": 15739.65,
  112. "Open": 15845.1,
  113. "Volume": 0,
  114. "id": 10
  115. },
  116. {
  117. "Close": 16259.3,
  118. "Date": "2022-05-17T10:00:00.000Z",
  119. "High": 16284.25,
  120. "Low": 15900.8,
  121. "Open": 15912.6,
  122. "Volume": 0,
  123. "id": 11
  124. },
  125. {
  126. "Close": 16240.3,
  127. "Date": "2022-05-18T10:00:00.000Z",
  128. "High": 16399.8,
  129. "Low": 16211.2,
  130. "Open": 16318.15,
  131. "Volume": 0,
  132. "id": 12
  133. },
  134. {
  135. "Close": 15809.4,
  136. "Date": "2022-05-19T10:00:00.000Z",
  137. "High": 15984.75,
  138. "Low": 15775.2,
  139. "Open": 15917.4,
  140. "Volume": 0,
  141. "id": 13
  142. },
  143. {
  144. "Close": 16266.15,
  145. "Date": "2022-05-20T10:00:00.000Z",
  146. "High": 16283.05,
  147. "Low": 16003.85,
  148. "Open": 16043.8,
  149. "Volume": 0,
  150. "id": 14
  151. },
  152. {
  153. "Close": 16214.7,
  154. "Date": "2022-05-23T10:00:00.000Z",
  155. "High": 16414.7,
  156. "Low": 16185.75,
  157. "Open": 16290.95,
  158. "Volume": 0,
  159. "id": 15
  160. },
  161. {
  162. "Close": 16125.15,
  163. "Date": "2022-05-24T10:00:00.000Z",
  164. "High": 16262.8,
  165. "Low": 16078.6,
  166. "Open": 16225.55,
  167. "Volume": 0,
  168. "id": 16
  169. },
  170. {
  171. "Close": 16025.8,
  172. "Date": "2022-05-25T10:00:00.000Z",
  173. "High": 16223.35,
  174. "Low": 16006.95,
  175. "Open": 16196.35,
  176. "Volume": 0,
  177. "id": 17
  178. },
  179. {
  180. "Close": 16170.15,
  181. "Date": "2022-05-26T10:00:00.000Z",
  182. "High": 16204.45,
  183. "Low": 15903.7,
  184. "Open": 16105,
  185. "Volume": 0,
  186. "id": 18
  187. },
  188. {
  189. "Close": 16352.45,
  190. "Date": "2022-05-27T10:00:00.000Z",
  191. "High": 16370.6,
  192. "Low": 16221.95,
  193. "Open": 16296.6,
  194. "Volume": 0,
  195. "id": 19
  196. },
  197. {
  198. "Close": 16661.4,
  199. "Date": "2022-05-30T10:00:00.000Z",
  200. "High": 16695.5,
  201. "Low": 16506.15,
  202. "Open": 16527.9,
  203. "Volume": 0,
  204. "id": 20
  205. },
  206. {
  207. "Close": 16584.55,
  208. "Date": "2022-05-31T10:00:00.000Z",
  209. "High": 16690.75,
  210. "Low": 16521.9,
  211. "Open": 16578.45,
  212. "Volume": 0,
  213. "id": 21
  214. },
  215. {
  216. "Close": 16522.75,
  217. "Date": "2022-06-01T10:00:00.000Z",
  218. "High": 16649.2,
  219. "Low": 16438.85,
  220. "Open": 16594.4,
  221. "Volume": 0,
  222. "id": 22
  223. },
  224. {
  225. "Close": 16628,
  226. "Date": "2022-06-02T10:00:00.000Z",
  227. "High": 16646.4,
  228. "Low": 16443.05,
  229. "Open": 16481.65,
  230. "Volume": 0,
  231. "id": 23
  232. },
  233. {
  234. "Close": 16584.3,
  235. "Date": "2022-06-03T10:00:00.000Z",
  236. "High": 16793.85,
  237. "Low": 16567.9,
  238. "Open": 16761.65,
  239. "Volume": 0,
  240. "id": 24
  241. },
  242. {
  243. "Close": 16569.55,
  244. "Date": "2022-06-06T10:00:00.000Z",
  245. "High": 16610.95,
  246. "Low": 16444.55,
  247. "Open": 16530.7,
  248. "Volume": 0,
  249. "id": 25
  250. },
  251. {
  252. "Close": 16416.35,
  253. "Date": "2022-06-07T10:00:00.000Z",
  254. "High": 16487.25,
  255. "Low": 16347.1,
  256. "Open": 16469.6,
  257. "Volume": 0,
  258. "id": 26
  259. },
  260. {
  261. "Close": 16356.25,
  262. "Date": "2022-06-08T10:00:00.000Z",
  263. "High": 16514.3,
  264. "Low": 16293.35,
  265. "Open": 16474.95,
  266. "Volume": 0,
  267. "id": 27
  268. },
  269. {
  270. "Close": 16478.1,
  271. "Date": "2022-06-09T10:00:00.000Z",
  272. "High": 16492.8,
  273. "Low": 16243.85,
  274. "Open": 16263.85,
  275. "Volume": 0,
  276. "id": 28
  277. },
  278. {
  279. "Close": 16201.8,
  280. "Date": "2022-06-10T10:00:00.000Z",
  281. "High": 16324.7,
  282. "Low": 16172.6,
  283. "Open": 16283.95,
  284. "Volume": 0,
  285. "id": 29
  286. },
  287. {
  288. "Close": 15774.4,
  289. "Date": "2022-06-13T10:00:00.000Z",
  290. "High": 15886.15,
  291. "Low": 15684,
  292. "Open": 15877.55,
  293. "Volume": 0,
  294. "id": 30
  295. },
  296. {
  297. "Close": 15732.1,
  298. "Date": "2022-06-14T10:00:00.000Z",
  299. "High": 15858,
  300. "Low": 15659.45,
  301. "Open": 15674.25,
  302. "Volume": 0,
  303. "id": 31
  304. },
  305. {
  306. "Close": 15692.15,
  307. "Date": "2022-06-15T10:00:00.000Z",
  308. "High": 15783.65,
  309. "Low": 15678.9,
  310. "Open": 15729.25,
  311. "Volume": 0,
  312. "id": 32
  313. },
  314. {
  315. "Close": 15360.6,
  316. "Date": "2022-06-16T10:00:00.000Z",
  317. "High": 15863.15,
  318. "Low": 15335.1,
  319. "Open": 15832.25,
  320. "Volume": 0,
  321. "id": 33
  322. },
  323. {
  324. "Close": 15293.5,
  325. "Date": "2022-06-17T10:00:00.000Z",
  326. "High": 15400.4,
  327. "Low": 15183.4,
  328. "Open": 15272.65,
  329. "Volume": 0,
  330. "id": 34
  331. },
  332. {
  333. "Close": 15350.15,
  334. "Date": "2022-06-20T10:00:00.000Z",
  335. "High": 15382.5,
  336. "Low": 15191.1,
  337. "Open": 15334.5,
  338. "Volume": 0,
  339. "id": 35
  340. },
  341. {
  342. "Close": 15638.8,
  343. "Date": "2022-06-21T10:00:00.000Z",
  344. "High": 15707.25,
  345. "Low": 15419.85,
  346. "Open": 15455.95,
  347. "Volume": 0,
  348. "id": 36
  349. }
  350. ]
  351. var dataReqdFormat = {
  352. labels: [],
  353. datasets: [{
  354. data: [],
  355. label: "Nifty",
  356. fill: true,
  357. borderColor: "rgba(75,192,192,1)"
  358. }]
  359. };
  360. dataset.forEach((datapoint) => {
  361. dataReqdFormat.labels.push(datapoint.Date.split('T')[0]);
  362. dataReqdFormat.datasets[0].data.push(datapoint.Close);
  363. })
  364. const [duration, setDuration] = React.useState(dataset.length);
  365. const [chartData, setChartData] = React.useState(dataReqdFormat);
  366. const changeData = (duration) => {
  367. setDuration(duration);
  368. console.log(dataReqdFormat);
  369. var tempData = dataReqdFormat;
  370. tempData.labels = dataReqdFormat.labels.slice(-duration);
  371. for (var i = 0; i < dataReqdFormat.datasets.length; i++) {
  372. tempData.datasets[i].data = dataReqdFormat.datasets[i].data.slice(-duration);
  373. }
  374. console.log(tempData);
  375. setChartData(tempData);
  376. }
  377. useEffect(() => {
  378. changeData(30);
  379. }, [])
  380. const options = {
  381. plugins: {
  382. legend: {
  383. display: false,
  384. },
  385. },
  386. };
  387. return (
  388. <div>
  389. <Grid sx={{alignItems:"center"}}>
  390. <Button onClick={() => changeData(3)} variant={duration === 3 ? "contained" : "outlined"} style={{ margin: "5px", marginBottom: "0", background: "white", color: "black" }}>
  391. 3D
  392. </Button>
  393. <Button onClick={() => changeData(7)} variant={duration === 7 ? "contained" : "outlined"} style={{ margin: "5px", marginBottom: "0", background: "white", color: "black" }}>
  394. 1W
  395. </Button>
  396. <Button onClick={() => changeData(30)} variant={duration === 30 ? "contained" : "outlined"} style={{ margin: "5px", marginBottom: "0", background: "white", color: "black" }}>
  397. 1M
  398. </Button>
  399. <Line data={chartData} options={options} />
  400. </Grid>
  401. </div>
  402. )
  403. }

我目前已经将rgba(75,192,192,1)分配给了不考虑趋势的线。任何帮助都是感激的。

qeeaahzv

qeeaahzv1#

您可以使用段来执行以下操作:

  1. var dataReqdFormat = {
  2. labels: [],
  3. datasets: [{
  4. data: [],
  5. label: "Nifty",
  6. fill: true,
  7. segment: {
  8. borderColor: ctx => ctx.p1.parsed.y <= ctx.p0.parsed.y ? 'red' : 'green'
  9. }
  10. }]
  11. };

示例:
第一个

编辑:

您可以使用可编写脚本的函数来执行此操作:

  1. var dataReqdFormat = {
  2. labels: [],
  3. datasets: [{
  4. data: [],
  5. label: "Nifty",
  6. fill: true,
  7. borderColor: (ctx) => {
  8. const data = ctx.chart.data.datasets[ctx.datasetIndex].data;
  9. return data[0] >= data[data.length - 1] ? 'red' : 'green'
  10. }
  11. }]
  12. };

示例:
第一个

展开查看全部

相关问题