python - 如何使用字符串值列出 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()
解决方案
推荐阅读
- python - PIL.Image.fromarray 方法背后的缩放比例是多少?
- shell - 如何检查目录及其所有递归内容的权限?
- html - div 中的文本越界且文本填充不起作用
- python - 低功耗蓝牙简单代码,发现错误()
- salt-stack - 在 Reactor 文件中使用 Requisites
- windows - 在 Windows 上模拟 HID 设备?
- javascript - 我需要等待我的异步函数,然后返回吗?
- python - 我怎样才能确保我可以打印 0 而不是一个负数来表示敌人在格斗游戏中死亡
- javascript - 使用复选框作为按钮在 jquery 中自动计算总数?
- android - android studio 什么都解决不了?我应该怎么办?