简体   繁体   English

Seaborn 在同一 x 轴上绘制多个条形图

[英]Seaborn draw multiple barplots on same x-axis

I am trying to plot two pandas series我正在尝试 plot 两个 pandas 系列

Series A

 Private             11210
 Self-emp-not-inc     1321
 Local-gov            1043
 ?                     963
 State-gov             683
 Self-emp-inc          579
 Federal-gov           472
 Without-pay             7
 Never-worked            3
Name: workclass, dtype: int64
Series B

 Self-emp-not-inc    1321
 Local-gov           1043
 State-gov            683
 Self-emp-inc         579
 Federal-gov          472
 Without-pay            7
 Never-worked           3
Name: workclass, dtype: int64
g = sns.barplot(x=A.index, y=A.values, color='green', ax=faxes[ax_id]) # some subplot
g.set_xticklabels(g.get_xticklabels(), rotation=30)
sns.barplot(x=B.index, y=B.values, color='red', ax=faxes[ax_id])

The first plot draws as expected:第一个 plot 按预期绘制:

在此处输入图像描述

however, once I draw the second something goes wrong (a couple of bar disappear, labels are incorrect, etc).但是,一旦我画出第二个,就会出现问题(几个条消失,标签不正确等)。

在此处输入图像描述

Partially related... how can I use log for y-axis (11K vs 3 hides the low number completely)部分相关......我如何将日志用于 y 轴(11K vs 3 完全隐藏了低数字)

You can concatenate A and B joining the index.您可以连接 A 和 B 加入索引。 Rows that appear in one but not in the other will be filled in with NaN or NA and will not be shown in the bar plot.出现在一个中但不在另一个中的行将用NaNNA填充,并且不会显示在条形 plot 中。

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

A = pd.Series({'Private': 11210,
               'Self-emp-not-inc': 1321,
               'Local-gov': 1043,
               '?': 963,
               'State-gov': 683,
               'Self-emp-inc': 579,
               'Federal-gov': 472,
               'Without-pay': 7,
               'Never-worked': 3}, name='workclass')
B = pd.Series({'Self-emp-not-inc': 1321,
               'Local-gov': 1043,
               'State-gov': 683,
               'Self-emp-inc': 579,
               'Federal-gov': 472,
               'Without-pay': 7,
               'Never-worked': 3}, name='workclass')
df = pd.concat([A.rename('workclass A'), B.rename('workclass B')], axis=1)
ax = df.plot.bar(rot=30, color=['darkgreen', 'crimson'])
plt.tight_layout()
plt.show()

结果图

The concatenated dataframe looks like:串联的 dataframe 看起来像:

                  workclass A  workclass B
Private                 11210          NaN
Self-emp-not-inc         1321       1321.0
Local-gov                1043       1043.0
?                         963          NaN
State-gov                 683        683.0
Self-emp-inc              579        579.0
Federal-gov               472        472.0
Without-pay                 7          7.0
Never-worked                3          3.0

Note that an integer can't be NaN , so B is automatically converted to a float type.请注意, integer 不能为NaN ,因此 B 会自动转换为浮点类型。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

A = {'Private':11210,                                                                 
'Self-emp-not-inc':1321,                                                         
'Local-gov':1043,                                                        
'?':963,                                                               
'State-gov':683,                                                                 
'Self-emp-inc':579,                                                              
'Federal-gov':472,                                                               
'Without-pay':7,                                                                 
'Never-worked':3}

B = {'Self-emp-not-inc':1321,                                                        
'Local-gov':1043,                                                               
'State-gov':683,                                                                
'Self-emp-inc':579,                                                             
'Federal-gov':472,                                                              
'Without-pay':7,                                                                
'Never-worked':3}

df = pd.concat([pd.Series(A, name='A'), pd.Series(B, name='B')], axis=1)
sns.barplot(y=df.A.values, x=df.index, color='b', alpha=0.4, label='A')
sns.barplot(y=df.B.values, x=df.index, color='r', alpha=0.4, label='B', bottom=df.A.values)
plt.yscale('log')

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM