Как сделать несколько графиков для диаграммы Plotly Gauge? - PullRequest
0 голосов
/ 26 июня 2018

Я следую этому направлению (учебник), чтобы построить график калибровки

(https://plot.ly/python/gauge-charts/).

Но, похоже, на экране будет создана только одна диаграмма.

Знаете ли вы, как сделать несколько графиков, которые включают эти графики на одном экране (в одном HTML-файле)?

Итак, я хочу создать множество датчиков на одном экране.

Большое спасибо!

Так что это код.

import plotly
import plotly.plotly as py
import plotly.graph_objs as go

from plotly.offline import plot


import plotly.plotly as py
import plotly.graph_objs as go

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': [
        {
            'type': 'path',
            'path': 'M 0.235 0.5 L 0.24 0.65 L 0.245 0.5 Z',
            'fillcolor': 'rgba(44, 160, 101, 0.5)',
            'line': {
                'width': 0.5
            },
            'xref': 'paper',
            'yref': 'paper'
        }
    ],
    'annotations': [
        {
            'xref': 'paper',
            'yref': 'paper',
            'x': 0.23,
            'y': 0.45,
            'text': '50',
            'showarrow': False
        }
    ]
}

# we don't want the boundary now
base_chart['marker']['line']['width'] = 0

fig = {"data": [base_chart, meter_chart],
       "layout": layout}
plot(fig, filename='gauge-meter-chart')

1 Ответ

0 голосов
/ 27 июня 2018

Проблема в том, что тик генерируется как объект 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...