Есть ли способ, которым я могу построить 3 линейных графика с гистограммой как один график с разными осями Y? - PullRequest
2 голосов
/ 07 октября 2019

Я хочу построить 3 линейных графика вместе с диаграммой в виде одного графика в питон-пандах. Как мне построить их вместе с различными осями Y? Например, один линейный график как целевая линия диаграммы, а другой линейный график как цель другого линейного графика.

Таким образом, задача состоит в том, чтобы построить 4 графика как один график, у меня есть 2 разные переменные,один представляет собой% белка, который представляет собой диаграмму, а другой представляет собой калории, которые представляют собой линейный график, они оба имеют одну и ту же ось х, то есть месяцы. Теперь я хочу включить другие 2 линейных графика с каждым в качестве целевой переменной двух определенных выше переменных. Два линейных графика должны совместно использовать одну ось Y, а другой линейный график должен совместно использовать другую ось Y с диаграммой. Мне удалось построить две переменные с разными осями Y как один график, а также сделать один линейный график для совместного использования одной оси Y с одной переменной, но теперь я не могу сделать другой линейный график для совместного использования другого yось с другой переменной.

from bokeh.palettes import PuBu
from bokeh.io import show, output_notebook
from bokeh.models import ColumnDataSource, ranges, LabelSet, HoverTool
from bokeh.plotting import figure, show
from bokeh.models import LinearAxis, Range1d
# My word count data
months = nutrients_group.Month.tolist() 
p_percentage = nutrients_group.Protein_percetange.tolist()
calories = nutrients_group.Energy.tolist()
#protein_percent = [round(x) for x in p_percentage]
source = ColumnDataSource(dict(x=months, y=p_percentage))

# Output the visualization directly in the notebook
#output_notebook()

# Create a figure with a datetime type x-axis
fig = figure(title='Year overview with target',
             plot_height=400, plot_width=700,
             x_axis_label='Months', y_axis_label='Calories',
             x_minor_ticks=2,
             toolbar_location=None)







#labels = LabelSet(x=months, y=p_percentage)
fig.extra_y_ranges = {"Protein": Range1d(start=0, end=100)}
fig.add_layout(LinearAxis(y_range_name="Protein", axis_label='Protein %'), 'right')
fig.vbar(x='x',  top='y', 
         color='#27c738', width=0.75, 
         legend='Protein %', y_range_name= "Protein", source=source)

fig.line(x=months, y=130000, 
         color='purple', line_width=2,
         legend='Target 30%')
fig.line(x=months, y=240000, 
         color='red', line_width=2,
         legend='Calories Target 240000')

fig.line(x=months, y=calories, 
         color='#00b7f0', line_width=1,
         legend='Calories')
fig.y_range = Range1d(0, 400000)



fig.legend.location = 'top_right'

hover = HoverTool(
    tooltips=[
        ("month", "@x"),
        ("value", "@y")
    ]
)

# Let's check it out
fig.add_tools(hover)
show(fig)[enter image description here][1]

Я ожидаю, что моя целевая линия отображает переменные, разделяющие две разные оси Y.

1 Ответ

1 голос
/ 07 октября 2019

Если вы не против перейти на matplotlib для этого:

import matplotlib.pyplot as plt

xs = [1, 2, 3, 4, 5]  # x values
bar_ys = [28, 20, 10, 40, 10]  # left y axis
line_ys = [10, 20, 35, 40, 60]  # right y axis


fig, bar_ax = plt.subplots()
bar_ax.bar(xs, bar_ys, color='blue')  # plot first y series (line)
bar_ax.set_xlabel('x values')  # label for x axis
bar_ax.set_ylabel('bar values')  # label for left y axis
bar_ax.tick_params('y', colors='blue')  # add color to left y axis     

line_ax = bar_ax.twinx()
line_ax.plot(xs, line_ys, color='red')  # plot second y series (bar)
line_ax.set_ylabel('line values')  # label for right y axis
line_ax.tick_params('y', colors='red')  # add color to right y axis

plt.show()

Результирующая цифра:

enter image description here

Кпостроить несколько линейных графиков, просто добавьте новые вызовы к line_ax.plot, передавая новые значения Y в каждом вызове:

import matplotlib.pyplot as plt

xs = [1, 2, 3, 4, 5]  # x values
bar_ys = [28, 20, 10, 40, 10]  # left y axis
line_ys_1 = [10, 20, 35, 40, 60]  # right y axis
line_ys_2 = [40, 40, 40, 40, 40]  # right y axis
line_ys_3 = [10, 20, 10, 20, 60]  # right y axis


fig, bar_ax = plt.subplots()
bar_ax.bar(xs, bar_ys, color='blue')  # plot first y series (line)
bar_ax.set_xlabel('x values')  # label for x axis
bar_ax.set_ylabel('bar values')  # label for left y axis
bar_ax.tick_params('y', colors='blue')  # add color to left y axis     

line_ax = bar_ax.twinx()
line_ax.plot(xs, line_ys_1, color='red')  # plot second y series (bar)
line_ax.plot(xs, line_ys_2, color='green')  # plot second y series (bar)
line_ax.plot(xs, line_ys_3, color='yellow')  # plot second y series (bar)
line_ax.set_ylabel('line values')  # label for right y axis

plt.show()

Результирующая цифра:

enter image description here

По сути, вы можете использовать любую комбинацию вызовов для ax.plot, ax.bar и любой другой тип графика для осей, которые вы получаете от plt.subplots и ax.twinx. Графики, вызываемые на одном экземпляре топора, будут иметь одинаковую ось Y.

...