Как перечислить метки Kivy-Garden Graph x_axis major_tick со строковым значением? - PullRequest
0 голосов
/ 18 июня 2020

Это мой первый пост! Пожалуйста, простите меня, если я допущу какую-либо ошибку ... Я пытался заменить значение метки x_axis major_tick коротким названием каждого месяца в Kivy_Garden.Graph в течение последней недели и до сих пор не нашел решения. Пока мне удавалось использовать число каждого месяца, но это не идеально. Ниже приведен мой код, взятый из примера страницы (спасибо [Tshirtman]), модифицированный моими собственными примерами данных ...

Пожалуйста, не обращайте внимания на мои многочисленные комментарии, это мои многочисленные «жертвы» проб и ошибок ...

Любая помощь, указывающая мне правильное направление, приветствуется ...

import operator
import calendar
from kivy.app import App
from kivy.core.window import Window
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.scrollview import ScrollView
from kivy.uix.widget import Widget
from kivy.uix.relativelayout import RelativeLayout
from kivymd.material_resources import DEVICE_TYPE
from kivy_garden.graph import Graph, MeshLinePlot, LinePlot
# __all__ = ('Graph', 'Plot', 'MeshLinePlot', 'MeshStemPlot', 'LinePlot',
#            'SmoothLinePlot', 'ContourPlot', 'ScatterPlot', 'PointPlot')


class Plot1(RelativeLayout):
    def __init__(self, **kwargs):
        super(Plot1, self).__init__(**kwargs)


        strMth = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
        # x1 = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
        x1 = [1,2,3,4,5,6,7,8,9,10,11,12]
        y1 = [
            1.9336837768556001,
            2.29488830566305,
            3.77081146240305,
            8.034848022459,
            12.752540588372002,
            16.601560974130003,
            19.705297851575004,
            19.410496521000006,
            15.050564575200003,
            10.397409057613501,
            5.2474151611328,
            2.57436218261685
            ]

        yData = len(y1)

        xList = list(enumerate(strMth,1))
        if DEVICE_TYPE != 'mobile': print(f'xList={xList}')
        for x in range(0, yData): 
            if DEVICE_TYPE != 'mobile': print(f'xList[x]={xList[x]}')
        # intXmin = int(min(x1))
        # intXmax = int(max(x1))
        # if DEVICE_TYPE != 'mobile': print(f'intXmin={intXmin}')
        # if DEVICE_TYPE != 'mobile': print(f'intXmax={intXmax}')

        xdict = dict(enumerate(x1))
        if DEVICE_TYPE != 'mobile': print(f'xdict={xdict}')
        for x in range(0, yData): 
            if DEVICE_TYPE != 'mobile': 
                print(f'calendar.month_abbr[x]={calendar.month_abbr[x+1]}')
                print(f'xdict[x]={xdict[x]}')

        intXmin = int(min(xdict.keys())) + 1
        intXmax = int(max(xdict.keys())) + 1
        if DEVICE_TYPE != 'mobile': print(f'intXmin={intXmin}')
        if DEVICE_TYPE != 'mobile': print(f'intXmax={intXmax}')

        intYmax = int(max(y1)) + 1
        intYmin = int(min(y1)) - 1

        intYmajor = int((intYmax - intYmin) / 4)

        degree_sign= u'\N{DEGREE SIGN}'

        self.graph = Graph(
            pos_hint={'x': 0, 'y': 0},
            # size_hint=(1, 0.9),
            # x_ticks_minor=5,
            x_ticks_major=1,
            # y_ticks_minor=1,
            y_ticks_major=intYmajor,
            x_grid=True,
            y_grid=True,
            # x_axis=strMth,
            xmin=intXmin,
            xmax=intXmax,
            ymin=intYmin,
            ymax=intYmax,
            x_grid_label=True,
            y_grid_label=True,
            xlabel='Month',
            ylabel=f'Temp ({degree_sign}C)',
            draw_border=False
        )

        self.plot = MeshLinePlot(color=[1, 0, 0, 1])
        # self.plot.points = [(x, y1[x]) for x in range(0, yData)]
        # self.plot.points = [(x, y1[x]) for x, y in enumerate(x1)]
        self.plot.points = [(x1[x], y1[x]) for x, y in enumerate(x1)]
        # self.plot.points = [(calendar.month_abbr[x], y1[x]) for x, y in enumerate(x1)]

        # strMth = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
        # strMth = [(xdict[x]) for x in range(0, yData)]
        # self.graph.x_axis = xList
        if DEVICE_TYPE != 'mobile': print(f'self.graph1.x_axis={self.graph.x_axis}\n')

        self.add_widget(self.graph)

        self.graph.add_plot(self.plot)

class Plot2(RelativeLayout):
    def __init__(self, **kwargs):
        super(Plot2, self).__init__(**kwargs)

        # x1 = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
        x1 = [1,2,3,4,5,6,7,8,9,10,11,12]
        y2 = [
            101.77287445066001,
            92.02159576423,
            70.04141540531,
            57.75453948974499,
            53.007298469540004,
            52.04727563858499,
            45.965359878535004,
            47.2860280037,
            49.18611373901,
            64.60937595366501,
            96.76075782778503,
            113.429190444945
            ]

        yData = len(y2)
        xdict = dict(enumerate(x1))
        if DEVICE_TYPE != 'mobile': print(xdict)
        for x in range(0, yData): 
            if DEVICE_TYPE != 'mobile': print(xdict[x])
        intXmin = int(min(xdict.keys())) + 1
        intXmax = int(max(xdict.keys())) + 1
        if DEVICE_TYPE != 'mobile': print(f'intXmin={intXmin}')
        if DEVICE_TYPE != 'mobile': print(f'intXmax={intXmax}')

        intYmax = int(max(y2) + 1)
        intYmin = int(min(y2) - 1)

        intYmajor = int((intYmax - intYmin) / 4)

        self.graph = Graph(
            pos_hint={'x': 0, 'y': 0},
            # size_hint=(1, 0.9),
            # x_ticks_minor=5,
            x_ticks_major=1,
            y_ticks_minor=1,
            y_ticks_major=intYmajor,
            x_grid=True,
            y_grid=True,
            x_axis=(0,x1),
            xmin=intXmin,
            xmax=intXmax,
            ymin=intYmin,
            ymax=intYmax,
            x_grid_label=True,
            y_grid_label=True,
            xlabel='Month',
            ylabel='Percipitation (mm)',
            draw_border=False
        )

        self.plot = MeshLinePlot(color=[0, 0.749, 1, 1])
        # self.plot.points = [(x, y1[x]) for x in range(0, yData)]
        # self.plot.points = [(x, y2[x]) for x, y in enumerate(x1)]
        self.plot.points = [(x1[x], y2[x]) for x, y in enumerate(x1)]

        strMth = [(xdict[x]) for x in range(0, yData)]
        self.graph.x_axis = strMth

        if DEVICE_TYPE != 'mobile': print(f'self.graph2.x_axis={self.graph.x_axis}\n')

        # self.plot2 = MeshLinePlot(color=[1, 0, 0, 1])
        # self.plot2.points = [(x, cos(x / 10.0)) for x in range(0, 101)]
        self.add_widget(self.graph)

        self.graph.add_plot(self.plot)
        # self.graph.add_plot(self.plot2)

class GraphLayoutApp(App):

    def ScreenClose_on_press(self, *args):
        print('Exiting...')
        return

    def build(self):
        Window.bind(on_request_close=self.ScreenClose_on_press)

        scroll_view = ScrollView()
        grid_layout = GridLayout(cols=1, padding=20, spacing=20, size_hint_y=None)
        grid_layout.bind(minimum_size=grid_layout.setter('size'))
        graph = Plot1(size_hint_y=None, height=300)
        graph2 = Plot2(size_hint_y=None, height=300)
        label = Label(text="Plot-1", size_hint_y=None, height=30)
        label2 = Label(text="Plot-2", size_hint_y=None, height=30)
        grid_layout.add_widget(label)
        grid_layout.add_widget(graph)
        grid_layout.add_widget(label2)
        grid_layout.add_widget(graph2)

        scroll_view.add_widget(grid_layout)
        return scroll_view

if __name__ == '__main__':
    GraphLayoutApp().run()
...