首页 > 解决方案 > 如何使用字符串值列出 Kivy-Garden Graph x_axis major_tick 标签?

问题描述

这是我的第一篇文章!如果我有任何失误,请原谅我......上周我一直试图用 Kivy_Garden.Graph 中每个月的短名称替换 x_axis major_tick 标签值,但仍然没有找到解决方案。到目前为止,我已经设法使用了每个月的数量,但这并不理想。下面是我的代码取自一个示例页面(感谢 [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()

标签: pythonandroidgraphkivy

解决方案


推荐阅读