Проблема в том, что тик генерируется как объект shape
в макете, это можно легко сделать с помощью небольших вычислений для позиций x
и y
. Пожалуйста, обратитесь к приведенному ниже примеру, где я использую for loop
, чтобы определить количество столбцов и разместить фигуры и аннотации в правильных положениях.
Примечание: я сделал это только для столбцов, пожалуйста, примените логику и сделайте так, чтобы она работала и для строк, также, пожалуйста, опубликуйте свое решение, если вы это сделаете, чтобы люди могли ссылаться на него в будущем !!
Пожалуйста, попробуйте следующий код и дайте мне знать, если ваша проблема решена!
import plotly
import plotly.plotly as py
import numpy as np
import pandas as pd
import plotly.offline as py_offline
import plotly.graph_objs as go
py_offline.init_notebook_mode()
base_chart = {
"values": [40, 10, 10, 10, 10, 10, 10],
"labels": ["-", "0", "20", "40", "60", "80", "100"],
"domain": {"x": [0, .48]},
"marker": {
"colors": [
'rgb(255, 255, 255)',
'rgb(255, 255, 255)',
'rgb(255, 255, 255)',
'rgb(255, 255, 255)',
'rgb(255, 255, 255)',
'rgb(255, 255, 255)',
'rgb(255, 255, 255)'
],
"line": {
"width": 1
}
},
"name": "Gauge",
"hole": .4,
"type": "pie",
"direction": "clockwise",
"rotation": 108,
"showlegend": False,
"hoverinfo": "none",
"textinfo": "label",
"textposition": "outside"
}
meter_chart = {
"values": [50, 10, 10, 10, 10, 10],
"labels": ["Days" + "<br>" + "haaga", "How", "Many", "Days", "Are", "Left"],
"marker": {
'colors': [
'rgb(255, 255, 255)',
'rgb(226,126,64)',
'rgb(223,162,103)',
'rgb(223,189,139)',
'rgb(226,210,172)',
'rgb(232,226,202)'
]
},
"domain": {"x": [0, 0.48]},
"name": "Days Guage",
"hole": .3,
"type": "pie",
"direction": "clockwise",
"rotation": 90,
"showlegend": False,
"textinfo": "label",
"textposition": "inside",
"hoverinfo": "none",
}
layout = {
'xaxis': {
'showticklabels': False,
'showgrid': False,
'zeroline': False
},
'yaxis': {
'showticklabels': False,
'showgrid': False,
'zeroline': False
},
'shapes': [],
'annotations': []
}
base_shape = {
'type': 'path',
'path': 'M 0.49 0.5 L 0.5 0.65 L 0.51 0.5 Z',
'fillcolor': 'rgba(44, 160, 101, 0.5)',
'line': {
'width': 0.5
},
'xref': 'paper',
'yref': 'paper'
}
base_annotation = {
'xref': 'paper',
'yref': 'paper',
'x': 0,
'y': 0.45,
'text': '50',
'showarrow': False
}
arr = []
columns = 4
tick_width = 0.009
increment = 1/columns
initial = 0
for i in range(columns):
basechart = copy.deepcopy(base_chart)
meterchart = copy.deepcopy(meter_chart)
start = initial
end = initial + increment
basechart['domain']['x'] = [start, end]
meterchart['domain']['x'] = [start, end]
# code for placing the tick on each of the dials
shape = copy.deepcopy(base_shape)
temp = (start + (increment/2))
shape['path'] = 'M '+str(temp-tick_width/2)+' 0.5 L '+str(temp)+' 0.59 L '+str(temp+tick_width/2)+' 0.5 Z'
layout['shapes'].append(shape)
# code for placing the value annotation on each of the dials
annotation = copy.deepcopy(base_annotation)
annotation['x'] = temp
layout['annotations'].append(annotation)
arr.append(basechart)
arr.append(meterchart)
initial = end
# we don't want the boundary now
base_chart['marker']['line']['width'] = 0
fig = {"data": arr,
"layout": layout}
py_offline.iplot(fig, filename='gauge-meter-chart')