From d1c78719ebfb60a657a8ca04d0d8909f0e6d6eb7 Mon Sep 17 00:00:00 2001 From: David Brazda Date: Wed, 12 Jun 2024 11:00:41 +0200 Subject: [PATCH] dynamic sizing (size=s,m,l) and height ratio --- lightweight_charts/helpers.py | 155 ++++++++++++++++++---------------- setup.py | 2 +- 2 files changed, 81 insertions(+), 76 deletions(-) diff --git a/lightweight_charts/helpers.py b/lightweight_charts/helpers.py index 8a5189f..2548f9c 100644 --- a/lightweight_charts/helpers.py +++ b/lightweight_charts/helpers.py @@ -10,103 +10,108 @@ class Panel: self.histogram = histogram if histogram is not None else [] self.title = title -def chart(panes: list[Panel], sync=False, title=''): - """Function to fast render a chart with multiple panes. +def chart(panes: list[Panel], sync=False, title='', size="m"): + """Function to fast render a chart with multiple panes. - Args: - panes (List[Pane]): A list of Pane instances to be rendered in the chart. - sync (bool): If True, synchronize scales of all panes. Default is False. - title (str): Title of the chart. Default is an empty string. + Args: + panes (List[Pane]): A list of Pane instances to be rendered in the chart. + sync (bool): If True, synchronize scales of all panes. Default is False. + title (str): Title of the chart. Default is an empty string. - Returns: - None. This function is expected to manipulate a graphical output or an external framework. - - # Example usage - ``` - pane1 = Pane( - ohlcv=(t1data.data["BAC"],), #(series, entries, exits, other_markers) - histogram=[(order_imbalance_allvolume, "oivol")] # [(series, name, "rgba(53, 94, 59, 0.6)")] - #following attributes corresponds to different priceScaleId and allow to display - # line series on these scale - right=[], # [(series, name, entries, exits, other_markers)] - left=[(sma, "sma", short_signals, short_exits)], - middle1=[], - middle2=[], - ) + Returns: + None. This function is expected to manipulate a graphical output or an external framework. - pane2 = Pane( - ohlcv=(t1data.data["BAC"],), - right=[], - left=[(sma, "sma_below", short_signals, short_exits)], - middle1=[], - middle2=[], - histogram=[(order_imbalance_sma, "oisma")] - ) + # Example usage + ``` + pane1 = Pane( + ohlcv=(t1data.data["BAC"],), #(series, entries, exits, other_markers) + histogram=[(order_imbalance_allvolume, "oivol")] # [(series, name, "rgba(53, 94, 59, 0.6)")] + #following attributes corresponds to different priceScaleId and allow to display + # line series on these scale + right=[], # [(series, name, entries, exits, other_markers)] + left=[(sma, "sma", short_signals, short_exits)], + middle1=[], + middle2=[], + ) - ch = chart([pane1, pane2], sync=True) - ``` - - """ - numpanes = len(panes) - main_title_set = False - for index, pane in enumerate(panes): - subchartX = None - if index == 0: - chartX = JupyterChart(width=1000, height=600, inner_width=1, inner_height=0.5, leftScale=bool(pane.left)) - active_chart = chartX - else: - subchartX = chartX.create_subchart(position='right', width=1, height=0.5, sync=sync, leftScale=bool(pane.left)) - active_chart = subchartX + pane2 = Pane( + ohlcv=(t1data.data["BAC"],), + right=[], + left=[(sma, "sma_below", short_signals, short_exits)], + middle1=[], + middle2=[], + histogram=[(order_imbalance_sma, "oisma")] + ) - if pane.ohlcv is not None: - series, entries, exits, markers = (pane.ohlcv + (None,) * 4)[:4] - active_chart.set(series) - if entries is not None: + ch = chart([pane1, pane2], sync=True) + ``` + + """ + size_to_dimensions = { + 's': (800, 400), + 'm': (1000, 600), + 'l': (1300, 800)} + width, height = size_to_dimensions.get(size, (1000, 600)) + height_ratio = 1 / len(panes) + main_title_set = False + for index, pane in enumerate(panes): + subchartX = None + if index == 0: + chartX = JupyterChart(width=width, height=height, inner_width=1, inner_height=height_ratio, leftScale=bool(pane.left)) + active_chart = chartX + else: + subchartX = chartX.create_subchart(position='right', width=1, height=height_ratio, sync=sync, leftScale=bool(pane.left)) + active_chart = subchartX + + if pane.ohlcv is not None: + series, entries, exits, markers = (pane.ohlcv + (None,) * 4)[:4] + active_chart.set(series) + if entries is not None: active_chart.markers_set(entries, "entries") - if exits is not None: + if exits is not None: active_chart.markers_set(exits, "exits") - if markers is not None: + if markers is not None: active_chart.markers_set(markers) - for tup in pane.histogram: - series, name, color, _, _ = (tup + (None, None, None, None, None))[:5] - if series is None: + for tup in pane.histogram: + series, name, color, _, _ = (tup + (None, None, None, None, None))[:5] + if series is None: continue - #conditionally include color - kwargs = {'name': name} - if color is not None: + #conditionally include color + kwargs = {'name': name} + if color is not None: kwargs['color'] = color - tmp = active_chart.create_histogram(**kwargs) #green transparent "rgba(53, 94, 59, 0.6)" - tmp.set(series) + tmp = active_chart.create_histogram(**kwargs) #green transparent "rgba(53, 94, 59, 0.6)" + tmp.set(series) - if pane.title is not None: + if pane.title is not None: active_chart.topbar.textbox("title",pane.title) main_title_set = True if index==0 else False - #iterate over keys - they are all priceScaleId except of histogram and ohlcv - for att_name, att_value_tuple in vars(pane).items(): - if att_name in ["ohlcv","histogram","title"]: + #iterate over keys - they are all priceScaleId except of histogram and ohlcv + for att_name, att_value_tuple in vars(pane).items(): + if att_name in ["ohlcv","histogram","title"]: continue - for tup in att_value_tuple: + for tup in att_value_tuple: series, name, entries, exits, markers = (tup + (None, None, None, None, None))[:5] if series is None: - continue + continue tmp = active_chart.create_line(name=name, priceScaleId=att_name)#, color="blue") tmp.set(series) if entries is not None: - tmp.markers_set(entries, "entries") + tmp.markers_set(entries, "entries") if exits is not None: - tmp.markers_set(exits, "exits") + tmp.markers_set(exits, "exits") if markers is not None: - tmp.markers_set(markers) - - active_chart.legend(True) - active_chart.fit() + tmp.markers_set(markers) + + active_chart.legend(True) + active_chart.fit() - if not main_title_set: - chartX.topbar.textbox("title",title) - chartX.legend(True) - chartX.fit() - chartX.load() - return chartX + if not main_title_set: + chartX.topbar.textbox("title",title) + chartX.legend(True) + chartX.fit() + chartX.load() + return chartX diff --git a/setup.py b/setup.py index ff069f9..4c8a011 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ with open('README.md', 'r', encoding='utf-8') as f: setup( name='lightweight_charts', - version='2.0.11', + version='2.0.12', packages=find_packages(), python_requires='>=3.8', install_requires=[