Python 熊猫条形图:添加标记以区分0和NaN

Python 熊猫条形图:添加标记以区分0和NaN,python,pandas,matplotlib,plot,nan,Python,Pandas,Matplotlib,Plot,Nan,我在Python中获得了以下数据帧: df = pd.DataFrame([10,0,np.nan,8],index=[1947,1948,1949,1950], columns=['values']) df values 1947 10 1948 0 1949 NaN 1950 8 我想用df.plot(kind='bar')做一个条形图 我怎样才能添加一种标记来说明0和NaN之间的区别(并将其添加到图例中) 一般结果如下所示: 编辑:

我在Python中获得了以下数据帧:

df = pd.DataFrame([10,0,np.nan,8],index=[1947,1948,1949,1950], columns=['values'])
df
      values
1947      10
1948       0
1949     NaN
1950       8
我想用
df.plot(kind='bar')
做一个条形图

我怎样才能添加一种标记来说明
0
NaN
之间的区别(并将其添加到图例中)

一般结果如下所示:

编辑:嗯,最好是这样:


我曾尝试将“分散”选项与firelynx的第一个解决方案结合使用,但仍有一些错误…

很容易将NAN可视化,如果您没有任何具体要求,以下是多种方法之一:

df['isnan'] = pd.isnull(df['values'])
df.plot(kind='bar')

还有一种方法:

df['values'] = df['values'].fillna(-1)
df.plot(kind='bar')

和往常一样,一旦你想要某样东西,它就会变得复杂得多

import matplotlib.pyplot as plt
import matplotlib.ticker as plticker

markers = df[df['isnan']]
fig, ax1 = plt.subplots()
ax1.bar(df.index, df['values'], 0.4, align='center')       
ax1.plot(markers.index, markers, 'ro')
loc = plticker.MultipleLocator(base=1.0)
ax1.xaxis.set_major_locator(loc)
ax1.xaxis.set_ticklabels(["","1947", "1948", "1949", "1950"])
plt.show()


这更像是一个数据可视化问题。。。你需要定义你想要它的外观,然后你可以实现它并在需要时获得帮助。@user3017048如果你想让这个图看起来有任何其他方式,只需发布一个示例图片,我将尝试为你制作一个类似的图。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

df = pd.DataFrame([10,0,np.nan,8],index=[1947,1948,1949,1950], columns=['values'])
ax = df.plot(kind='bar', color='gray', alpha=0.5)
ax.get_figure().set_facecolor('white')

nan_idx = np.where(df['values'].isnull())[0]
plt.axvspan(nan_idx-0.25, nan_idx+0.25, facecolor='white', alpha=0.5, hatch='X')

nan_legend = mpatches.Patch(facecolor='white', edgecolor='gray', hatch='X', label='nan Value')
ordinary_legend = mpatches.Patch(color='gray', label='ordinary Value')
plt.legend(handles=[nan_legend, ordinary_legend])

plt.show()