为什么 matplotlib 开始绘制条形图而不是折线图

Why matplotlib starts to draw barchart instead of line chart

这段简单的代码按预期绘制折线图:

james_f=names[(names.name=='James') & (names.sex=='F')]
plt.plot(james_f['year'],james_f['births'])    
plt.show()

但后来我改变条件,只删除其中一个,然后它开始绘制条形图。为什么以及如何强制绘制折线图?

james_f=names[(names.name=='James')]
plt.plot(james_f['year'],james_f['births'])    
plt.show()

添加代替它的 1==1 规则,没有任何变化(

james_f=names[(names.name=='James') & ( 1 == 1)]
plt.plot(james_f['year'],james_f['births'])    
plt.show()

即使这段代码绘制条形图:

james_f=names[(names.name=='James') | (names.name=='John') | (names.name=='Robert') ]
plt.plot(james_f['year'],james_f['births'])

james_f['births'] 输出 (pandas.core.series.Series):

228           46
343           22
538           11
942         9655
944         5927
2312          26
2329          24
2617           9
2938        8769
....
Name: births, dtype: int64

james_f['births'].min() return 7 没有零值或 NaN 值

>>> print(james_f[james_f['births'].isnull()])
Empty DataFrame
Columns: [name, sex, births, year]
Index: []


>>> james_f.head(10)
        name    sex births  year
343     James   F   22      1880
944     James   M   5927    1880
2329    James   F   24      1881
2940    James   M   5441    1881
4372    James   F   18      1882
4965    James   M   5892    1882
6428    James   F   25      1883
7118    James   M   5223    1883
8488    James   F   33      1884
9320    James   M   5693    1884

不过滤性别每年会产生两种观察结果:一种针对女性,一种针对男性。姓名为'James'的男女人数相差很大,让剧情显得很嘈杂。你有(至少)两个选择:

(1)像这样总结男女人数

james = names[names.name == 'james']
years = []
births = []
for year, subset in james.groupby('year'):
    years.append(year)
    births.append(subset.births.sum())

plt.plot(years, births)

有更多pandas技能的人可能会把它写成一行。

(2) 像这样为男性和女性绘制两条单独的线。

james = names[names.name == 'james']
for sex, subset in james.groupby('sex'):
    plt.plot(subset.year, subset.births, label=sex)
plt.legend()