forked from cerc-io/cosmos-explorer
use scatter chart
This commit is contained in:
parent
24d1f92bae
commit
976ebef410
@ -23,7 +23,7 @@
|
|||||||
"@ledgerhq/hw-app-cosmos": "^6.3.0",
|
"@ledgerhq/hw-app-cosmos": "^6.3.0",
|
||||||
"@ledgerhq/hw-transport-web-ble": "^6.3.0",
|
"@ledgerhq/hw-transport-web-ble": "^6.3.0",
|
||||||
"@ledgerhq/hw-transport-webusb": "^6.3.0",
|
"@ledgerhq/hw-transport-webusb": "^6.3.0",
|
||||||
"@vue/composition-api": "^1.4.0",
|
"@vue/composition-api": "^1.4.9",
|
||||||
"@vueuse/core": "4.0.0",
|
"@vueuse/core": "4.0.0",
|
||||||
"animate.css": "4.1.1",
|
"animate.css": "4.1.1",
|
||||||
"apexcharts": "3.24.0",
|
"apexcharts": "3.24.0",
|
||||||
@ -36,7 +36,7 @@
|
|||||||
"core-js": "3.8.1",
|
"core-js": "3.8.1",
|
||||||
"cosmjs-types": "^0.2.0",
|
"cosmjs-types": "^0.2.0",
|
||||||
"dayjs": "^1.10.6",
|
"dayjs": "^1.10.6",
|
||||||
"echarts": "4.8.0",
|
"echarts": "5.3.0",
|
||||||
"leaflet": "1.6.0",
|
"leaflet": "1.6.0",
|
||||||
"ledger-cosmos-js": "2.1.8",
|
"ledger-cosmos-js": "2.1.8",
|
||||||
"long": "^5.2.0",
|
"long": "^5.2.0",
|
||||||
@ -60,7 +60,7 @@
|
|||||||
"vue-cleave-component": "2.1.3",
|
"vue-cleave-component": "2.1.3",
|
||||||
"vue-clipboard2": "0.3.1",
|
"vue-clipboard2": "0.3.1",
|
||||||
"vue-context": "6.0.0",
|
"vue-context": "6.0.0",
|
||||||
"vue-echarts": "5.0.0-beta.0",
|
"vue-echarts": "^6.0.2",
|
||||||
"vue-feather-icons": "5.1.0",
|
"vue-feather-icons": "5.1.0",
|
||||||
"vue-flatpickr-component": "8.1.6",
|
"vue-flatpickr-component": "8.1.6",
|
||||||
"vue-flex-waterfall": "^1.0.7",
|
"vue-flex-waterfall": "^1.0.7",
|
||||||
|
@ -8,13 +8,13 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import ECharts from 'vue-echarts'
|
import * as ECharts from 'echarts'
|
||||||
import 'echarts/lib/component/tooltip'
|
import 'echarts/lib/component/tooltip'
|
||||||
import 'echarts/lib/component/legend'
|
import 'echarts/lib/component/legend'
|
||||||
import 'echarts/lib/chart/scatter'
|
import 'echarts/lib/chart/scatter'
|
||||||
import theme from './theme.json'
|
// import theme from './theme.json'
|
||||||
|
|
||||||
ECharts.registerTheme('theme-color', theme)
|
// ECharts.registerTheme('theme-color', theme)
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
@ -67,10 +67,9 @@
|
|||||||
<b-col
|
<b-col
|
||||||
md="8"
|
md="8"
|
||||||
>
|
>
|
||||||
<chartjs-component-bar
|
<echart-scatter
|
||||||
:height="200"
|
:items.sync="scatters"
|
||||||
:chart-data="calculateChartBar"
|
auto-resize
|
||||||
:options="options"
|
|
||||||
/>
|
/>
|
||||||
</b-col>
|
</b-col>
|
||||||
</b-row>
|
</b-row>
|
||||||
@ -291,7 +290,7 @@ import AppCollapseItem from '@core/components/app-collapse/AppCollapseItem.vue'
|
|||||||
import OperationTransferComponent from './OperationTransferComponent.vue'
|
import OperationTransferComponent from './OperationTransferComponent.vue'
|
||||||
import OperationTransfer2Component from './OperationTransfer2Component.vue'
|
import OperationTransfer2Component from './OperationTransfer2Component.vue'
|
||||||
import ChartComponentDoughnut from './ChartComponentDoughnut.vue'
|
import ChartComponentDoughnut from './ChartComponentDoughnut.vue'
|
||||||
import ChartjsComponentBar from './ChartjsComponentBar.vue'
|
import EchartScatter from './components/charts/EchartScatter.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
@ -315,9 +314,9 @@ export default {
|
|||||||
ToastificationContent,
|
ToastificationContent,
|
||||||
OperationTransfer2Component,
|
OperationTransfer2Component,
|
||||||
ChartComponentDoughnut,
|
ChartComponentDoughnut,
|
||||||
ChartjsComponentBar,
|
|
||||||
AppCollapse,
|
AppCollapse,
|
||||||
AppCollapseItem,
|
AppCollapseItem,
|
||||||
|
EchartScatter,
|
||||||
},
|
},
|
||||||
directives: {
|
directives: {
|
||||||
'b-tooltip': VBTooltip,
|
'b-tooltip': VBTooltip,
|
||||||
@ -395,37 +394,29 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
calculateTotal() {
|
calculateTotal() {
|
||||||
const v = Object.values(this.balances)
|
|
||||||
let total = 0
|
let total = 0
|
||||||
if (v) {
|
if (this.calculateByDenom.value) {
|
||||||
v.forEach(tokens => {
|
Object.values(this.calculateByDenom.value).forEach(i => {
|
||||||
const subtotal = tokens.map(x => this.formatCurrency(x.amount, x.denom)).reduce((t, c) => t + c)
|
total += i
|
||||||
total += subtotal
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const d = Object.values(this.delegations)
|
|
||||||
if (d) {
|
|
||||||
d.forEach(tokens => {
|
|
||||||
const subtotal = tokens.map(x => this.formatCurrency(x.amount, x.denom)).reduce((t, c) => t + c, 0)
|
|
||||||
total += subtotal
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return numberWithCommas(parseFloat(total.toFixed(2)))
|
return numberWithCommas(parseFloat(total.toFixed(2)))
|
||||||
},
|
},
|
||||||
calculateTotalChange() {
|
scatters() {
|
||||||
const v = Object.values(this.balances)
|
const total = []
|
||||||
let total = 0
|
if (this.calculateByDenom.qty) {
|
||||||
if (v) {
|
Object.entries(this.calculateByDenom.qty).forEach(i => {
|
||||||
v.forEach(tokens => {
|
const price = this.getPrice(i[0])
|
||||||
const subtotal = tokens.map(x => this.formatCurrency(x.amount, x.denom) * this.getChanges(x.denom) * 0.01).reduce((t, c) => t + c)
|
total.push([i[1], i[1] * price, price, i[0]])
|
||||||
total += subtotal
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const d = Object.values(this.delegations)
|
return total
|
||||||
if (d) {
|
},
|
||||||
d.forEach(tokens => {
|
calculateTotalChange() {
|
||||||
const subtotal = tokens.map(x => this.formatCurrency(x.amount, x.denom) * this.getChanges(x.denom) * 0.01).reduce((t, c) => t + c, 0)
|
let total = 0
|
||||||
total += subtotal
|
if (this.calculateByDenom.value) {
|
||||||
|
Object.entries(this.calculateByDenom.value).forEach(i => {
|
||||||
|
total += i[1] * this.getChanges(i[0]) * 0.01
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
return parseFloat(total.toFixed(2))
|
return parseFloat(total.toFixed(2))
|
||||||
@ -491,32 +482,6 @@ export default {
|
|||||||
],
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
calculateChartBar() {
|
|
||||||
const total = this.calculateByDenom
|
|
||||||
// Object.entries(total.value).sort((a, b) => b[0].localeCompare(a[0]));
|
|
||||||
const data = Object.entries(total.value).sort((a, b) => b[1] - a[1]).slice(0, 15)
|
|
||||||
return {
|
|
||||||
labels: data.map(x => x[0]),
|
|
||||||
datasets: [
|
|
||||||
{
|
|
||||||
label: 'Market Cap',
|
|
||||||
data: data.map(x => x[1]),
|
|
||||||
backgroundColor: chartColors(),
|
|
||||||
borderWidth: 0,
|
|
||||||
pointStyle: 'rectRounded',
|
|
||||||
yAxisID: 'y-axis-1',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Qty',
|
|
||||||
data: data.map(x => total.qty[x[0]]), // Object.values(total.qty),
|
|
||||||
backgroundColor: chartColors(),
|
|
||||||
borderWidth: 0,
|
|
||||||
pointStyle: 'rectRounded',
|
|
||||||
yAxisID: 'y-axis-2',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.init()
|
this.init()
|
||||||
@ -593,13 +558,7 @@ export default {
|
|||||||
},
|
},
|
||||||
formatCurrency(amount, denom) {
|
formatCurrency(amount, denom) {
|
||||||
const qty = this.formatAmount(amount, denom, false)
|
const qty = this.formatAmount(amount, denom, false)
|
||||||
const d2 = this.formatDenom(denom)
|
return qty * this.getPrice(denom)
|
||||||
const quote = this.$store.state.chains.quotes[d2]
|
|
||||||
if (quote) {
|
|
||||||
const price = quote[this.currency2]
|
|
||||||
return parseFloat((qty * price).toFixed(2))
|
|
||||||
}
|
|
||||||
return 0
|
|
||||||
},
|
},
|
||||||
priceColor(denom) {
|
priceColor(denom) {
|
||||||
const d2 = this.formatDenom(denom)
|
const d2 = this.formatDenom(denom)
|
||||||
@ -610,6 +569,11 @@ export default {
|
|||||||
}
|
}
|
||||||
return ''
|
return ''
|
||||||
},
|
},
|
||||||
|
getPrice(denom) {
|
||||||
|
const d2 = this.formatDenom(denom)
|
||||||
|
const quote = this.$store.state.chains.quotes[d2]
|
||||||
|
return quote ? quote[this.currency2] : 0
|
||||||
|
},
|
||||||
getChanges(denom) {
|
getChanges(denom) {
|
||||||
const d2 = this.formatDenom(denom)
|
const d2 = this.formatDenom(denom)
|
||||||
const quote = this.$store.state.chains.quotes[d2]
|
const quote = this.$store.state.chains.quotes[d2]
|
||||||
|
132
src/views/components/charts/EchartScatter.vue
Normal file
132
src/views/components/charts/EchartScatter.vue
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<v-chart
|
||||||
|
class="chart"
|
||||||
|
autoresize
|
||||||
|
:option="option"
|
||||||
|
/></div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { use } from 'echarts/core'
|
||||||
|
import { CanvasRenderer } from 'echarts/renderers'
|
||||||
|
import { ScatterChart } from 'echarts/charts'
|
||||||
|
import {
|
||||||
|
TitleComponent,
|
||||||
|
TooltipComponent,
|
||||||
|
LegendComponent,
|
||||||
|
} from 'echarts/components'
|
||||||
|
import VChart, { THEME_KEY } from 'vue-echarts'
|
||||||
|
import { formatNumber } from '@/libs/utils'
|
||||||
|
|
||||||
|
use([
|
||||||
|
CanvasRenderer,
|
||||||
|
ScatterChart,
|
||||||
|
TitleComponent,
|
||||||
|
TooltipComponent,
|
||||||
|
LegendComponent,
|
||||||
|
])
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AssetScatter',
|
||||||
|
components: {
|
||||||
|
VChart,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
items: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
provide: {
|
||||||
|
[THEME_KEY]: 'light',
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
option() {
|
||||||
|
return {
|
||||||
|
title: {
|
||||||
|
text: '',
|
||||||
|
left: '5%',
|
||||||
|
top: '3%',
|
||||||
|
},
|
||||||
|
// legend: {
|
||||||
|
// right: '10%',
|
||||||
|
// top: '3%',
|
||||||
|
// data: ['1990', '2015'],
|
||||||
|
// },
|
||||||
|
// grid: {
|
||||||
|
// left: '8%',
|
||||||
|
// top: '10%',
|
||||||
|
// },
|
||||||
|
xAxis: {
|
||||||
|
name: 'Qty',
|
||||||
|
splitLine: {
|
||||||
|
lineStyle: {
|
||||||
|
type: 'dashed',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
axisLabel: {
|
||||||
|
formatter(param) {
|
||||||
|
return formatNumber(param, true, 0)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
name: 'Value',
|
||||||
|
axisLabel: {
|
||||||
|
formatter(param) {
|
||||||
|
return formatNumber(param, true, 0)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
splitLine: {
|
||||||
|
lineStyle: {
|
||||||
|
type: 'dashed',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
scale: true,
|
||||||
|
},
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
data: this.items,
|
||||||
|
type: 'scatter',
|
||||||
|
symbolSize(data) {
|
||||||
|
const r = Math.log(data[2]) * 5
|
||||||
|
if (r > 50) {
|
||||||
|
return 50
|
||||||
|
}
|
||||||
|
if (r < 10) {
|
||||||
|
return 10
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
},
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series',
|
||||||
|
label: {
|
||||||
|
show: true,
|
||||||
|
formatter(param) {
|
||||||
|
return param.data[3]
|
||||||
|
},
|
||||||
|
position: 'top',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
itemStyle: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowColor: 'rgba(120, 36, 50, 0.5)',
|
||||||
|
shadowOffsetY: 5,
|
||||||
|
color: '#7367F0',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.chart {
|
||||||
|
height: 300px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue
Block a user