Files
OpenBB/openbb_terminal/economy/plot_view.py
jmaslek b71abcfbf4 Updating some names (#1575)
* quick econ fix

* black

* keys and feature flags

* terminal name 👀

* some more replacements

* some more replacements

* edit pyproject

* gst -> openbb

* add example portfolios back to git

* Update api from gst

* sorry.  skipping some tests

* another round of names

* another round of test edits

* Missed some .gst refs and update timezone

* water mark stuff

* Fixing Names in terminal.spec and name of GTFF_DEFAULTS to OBBFF_DEFAULTS

* fix more GST to OpenBB Terminal

* Logging : merge conflicts with main

* Revert wrong files

Co-authored-by: Andrew <andrew.kenreich@gmail.com>
Co-authored-by: DidierRLopes <dro.lopes@campus.fct.unl.pt>
Co-authored-by: Chavithra PARANA <chavithra@gmail.com>
2022-03-29 09:46:26 -04:00

154 lines
3.9 KiB
Python

""" Plot Controller """
import os
from typing import Optional, List, Dict, Any
from textwrap import fill
import pandas as pd
from matplotlib import pyplot as plt
from openbb_terminal.config_plot import PLOT_DPI
from openbb_terminal.config_terminal import theme
from openbb_terminal.helper_funcs import (
plot_autoscale,
export_data,
print_rich_table,
)
def show_plot(
dataset_yaxis_1,
dataset_yaxis_2,
export,
external_axes: Optional[List[plt.Axes]] = None,
):
"""
The ability to plot any data coming from EconDB, FRED or Yahoo Finance.
Parameters
----------
dataset_yaxis_1: pd.DataFrame
Data you wish to plot on the first y-axis.
dataset_yaxis_2 : pd.DataFrame
Data you wish to plot on the second y-axis.
external_axes: Optional[List[plt.axes]]
External axes to plot on
Returns
----------
Plots the data.
"""
if external_axes is None:
_, ax1 = plt.subplots(figsize=plot_autoscale(), dpi=PLOT_DPI)
else:
ax1, ax2 = external_axes
color_palette = theme.get_colors()
ax_1_coloring = 0
ax_2_coloring = -1
for column in dataset_yaxis_1:
ax1.plot(
dataset_yaxis_1[column],
label=column.replace("_", " "),
color=color_palette[ax_1_coloring],
)
ax_1_coloring += 1
theme.style_primary_axis(ax1)
if not dataset_yaxis_2.empty:
ax2 = ax1.twinx()
for column in dataset_yaxis_2:
ax2.plot(
dataset_yaxis_2[column],
label=column,
color=color_palette[ax_2_coloring],
)
ax_2_coloring += -1
theme.style_twin_axis(ax2)
ax2.legend(
[fill(column, 45) for column in dataset_yaxis_2.columns],
bbox_to_anchor=(0.55, 0.40, 1, -0.52),
loc="upper left",
mode="expand",
borderaxespad=0,
prop={"size": 9},
)
ax1.legend(
[fill(column, 45) for column in dataset_yaxis_1.columns],
bbox_to_anchor=(0, 0.40, 1, -0.52),
loc="upper right",
mode="expand",
borderaxespad=0,
prop={"size": 9},
)
if external_axes is None:
theme.visualize_output()
if export:
df = pd.concat([dataset_yaxis_1, dataset_yaxis_2], axis=1)
export_data(
export,
os.path.dirname(os.path.abspath(__file__)),
"plot_macro_data",
df,
)
def show_options(
datasets: Dict[Any, pd.DataFrame], raw: str = "", limit: int = 10, export: str = ""
):
"""
The ability to plot any data coming from EconDB, FRED or Yahoo Finance.
Parameters
----------
datasets: Dict[Any, pd.DataFrame]
A dictionary with the format {command: data}.
raw : bool
Whether you wish to show the data available.
limit: int
The amount of rows you wish to show.
export: bool
Whether you want to export the data.
Returns
----------
Plots the data.
"""
if raw or export:
df = pd.DataFrame()
for _, data in datasets.items():
df = pd.concat([df, data], axis=1)
if raw:
print_rich_table(
df.tail(limit),
show_index=True,
headers=list(df.columns),
title="Macro data",
)
if export:
export_data(
export,
os.path.dirname(os.path.abspath(__file__)),
"dataset",
df,
)
else:
options = {
command: ", ".join(values.keys()) for command, values in datasets.items()
}
print_rich_table(
pd.DataFrame.from_dict(options, orient="index", columns=["Options"]),
show_index=True,
index_name="Command",
title="Options available to plot",
)