2017-10-15 97 views
2

这个简单的代码绘制预期折线图:为什么matplotlib开始绘制的条形图,而不是线图

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

enter image description here

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

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

enter image description here

增加,而不是它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']输出(大熊猫。 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()回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 
+0

看起来你的数据中有一些零而不是matplotlib改变它的行为。在有问题的情况下,james_f ['births']的输出是什么? –

+0

'james_f ['births']'的输出是什么? –

+0

@TillHoffmann更新信息 – Rocketq

回答

2

关于性别的产量每年两次的观察不过滤:一个为妇女和一男子。名叫'詹姆斯'的男人和女人的数量差别很大,使得情节显得非常嘈杂。你有(至少)两个选项:

(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) 

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

(2)为男性和女性绘制两条不同的线条。

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

是的,你说得对,只需要总结这些值) – Rocketq