如何使用Seaborn在Matplotlib条形图上配置标题

时间:2018-03-24 02:28:52

标签: python matplotlib charts seaborn

对Python,Pandas和matplotlib / seaborn来说只是一点点新手,所以请耐心等待。

我有一个65k行的数据框

我试图在堆积条形图中绘制这个

我已经使用了这些初始设置(没有它们看起来比它们看起来更糟)我曾经尝试过一次切出它们以查看我是否可以使用seaborn来使我的故障排除更容易,但它似乎我真的需要它们才能让这个显示效果更加不错

#required libraries:
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt

#for some improved visuals
import seaborn as sns
from pylab import rcParams

#this line enables the plots to be embedded into the notebook
%matplotlib inline

# Set some options as I have been used to having them 
pd.set_option('html', True)
pd.set_option('max_columns', 40)
pd.set_option('max_rows', 20)
sns.set(style="ticks")
matplotlib.style.use('ggplot')
rcParams['figure.figsize'] = 15, 10
rcParams['font.size'] = 20
rcParams['axes.facecolor'] = 'white'

我对数据进行分组的代码如下所示:

HouseholdIncomeVSOccupation = workingdata.groupby(['house INCOME'
, 'OCCUPATION_M'])['house INCOME'].count().unstack('OCCUPATION_M')

我绘制图表的代码如下所示:

colors = ['#0066CC', '#33FF33', '#FF99CC', '#FDEBD0', '#CC9933'
, '#FF0000', 'black', '#3333FF', 'grey', '#CC66FF'
, '#339900','#FF3399','#FFFF66','#990000']

HouseholdIncomeVSOccupation.plot(kind='bar', stacked=True, color=colors) 

这给出了这个结果: enter image description here

我想添加一个标题

plt.title('Household Income VS Occupation')

这给出了这个结果: enter image description here

我不太明白为什么我的绘图代码会使它成为一个子图,我确实认识到这是因为它是一个子图我上面有空标题,标题就在上面。

我想格式化一些事情:

  1. 我真的只是想在我的第一张图表上显示标题 - 所以如果有人可以告诉我如何在子图中设置标题而不是整个图表可以正常工作。更好的是告诉我如何将其作为主图表,而不是一个子图。
  2. 我想将图例移到图表外部,理想情况下位于图表空间下方,条目从左到右排列在几行上(有点像Excel一样)。这可能太难了(因为太多的代码使其运行良好),在这种情况下,将图表放在右侧的图表之外将是下一个最佳选择(希望这是一个简单的1个班轮)。
  3. 我想列出每个Axis
  4. 我非常感谢社区在这方面的帮助,我非常享受我的Python发现之旅。我只需要让它们中的一些比我迄今为止所采用的方式更快地工作。当然喜欢能够快速轻松地处理数百万行的数据帧。

    编辑: 获取ImportanceOfBeingErnest回复

    后,这是工作代码
    colors = ['#0066CC', '#33FF33', '#FF99CC', '#FDEBD0', '#CC9933',
    '#FF0000', 'black', '#3333FF', 'grey', '#CC66FF', '#339900',
    '#FF3399','#FFFF66','#990000']
    
    ax = HouseholdIncomeVSOccupation.plot(kind='bar', stacked=True, color=colors)
    ax.set_title('Household Income VS Occupation')
    ax.set_xlabel('Household Income')
    ax.set_ylabel('Count')
    plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
    

    我按照链接到他关于如何格式化传说的其他优秀答案。这给了最后一行工作代码......

2 个答案:

答案 0 :(得分:1)

  

更好的是告诉我如何将其作为主要图表而不是   是一个副图。

import matplotlib.pyplot as plt
plt.figure()

定位你的图例使用bb_to_anchor参数;你的情节是0到1 X和0到1 Y;图表下面的任何东西都是负Y;图表左侧为负X;你可以添加ncol的列;并展开传奇w / mode='expand'

  

图表外的图例,理想位于图表空间下方   条目从左到右排列在几行

plt.legend(bbox_to_anchor=(0., -0.3, 1., -0.4), mode="expand", ncol = 2)
  

右边图表外的传说

plt.legend(bbox_to_anchor=(1.05, 1))
  

我想为每个Axis命名

plt.xlabel()
plt.ylabel()

答案 1 :(得分:1)

您有两种选择,

  • 将数据框绘制到现有轴。在这种情况下,您没有轴手柄,因此您可以使用当前轴

    df.plot(..., ax=plt.gca())
    
  • 首先创建绘图,然后再修改它,

    ax = df.plot(...)
    ax.set_title(...)
    ax.set_xlabel(...)
    

有关如何从轴中获取图例,请参阅How to put the legend out of the plot