0

我尝试使用以下代码使用 pandas-bokeh 包制作面积图:

import pandas as pd
import numpy as np
import pandas_bokeh

df = pd.read_excel('D:/Coding Practice/data/data_corona_usa.xlsx')
df = df.iloc[::-1].reset_index()
df['Cummulative Cases'] = df['cases'].cumsum()
df['date'] = df['dateRep'].dt.strftime('%D')


#to make it appear in your notebook
pandas_bokeh.output_notebook()

df.plot_bokeh(
    kind='area',
    x= 'dateRep',
    y='Cummulative Cases',
    xlabel = 'Date',
    ylabel = 'Cummulative Cases',
    hovertool_string= r'''<h1> Date: @{date} </h1>
        <h2> Cummulative Cases: @{Cummulative Cases} </h2>''',
    title='US Corona Cases (cummulative)',
    hovertool=True,
    fontsize_title=18,
    logy=True,
    stacked=False,
    legend='top_left'
)

但是生成的面积图就像这张图片一样。

奇怪的区域图

该图表不涵盖该未知对角线下方的区域。之所以会出现此结果,是因为代码“logy = True”使 ytick 使用对数刻度。如果我删除这行代码,面积图会像这样正常显示。

正常面积图

即便如此,我希望面积图在 y 轴上使用对数刻度。我该如何解决?

4

1 回答 1

0

首先,您必须了解您的最小示例不是工作示例。您的本地路径使得重现行为变得非常困难,因为没有人能够像您一样加载数据。

其次,我必须告诉你,如果你想使用 pandas-bokeh,你的问题是无法解决的。这是因为面积图在此模块内用零初始化,如果您使用对数 y 轴,则零不存在。原因是未定义 log(0)。您可以看到的是默认行为。

如果您愿意切换到散景本身,欢迎您遵循以下最小示例:

一些示例数据:

import pandas as pd
df = pd.DataFrame({'cases':range(100)}))
df['Cummulative Cases'] = df['cases'].cumsum()
df 

初始数据

现在我们想用普通的散景重现你的观察。

from bokeh.io import show, output_notebook
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
output_notebook()

p = figure(x_range=(0, 100), y_range=(0.1,100000),y_axis_type="log")
source = ColumnDataSource(dict(x=df['cases'].values, 
                               y1=df['Cummulative Cases'].values, 
                               y2=[0]*df.shape[0]
                              )
                          )
p.varea(x='x', y1='y1', y2='y2', source=source)
show(p)

旧行为

如果您将基线差异设置为从零开始,可能会像这样y2=[0.01]*df.shape[0]您想要您正在寻找。

新行为

于 2020-08-07T11:47:19.083 回答