【问题标题】:how to configure title on Matplotlib barchart using Seaborn如何使用 Seaborn 在 Matplotlib 条形图上配置标题
【发布时间】:2018-03-25 11:04:45
【问题描述】:

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

这给出了这个结果:

我想加个标题

plt.title('Household Income VS Occupation')

这给出了这样的结果:

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

我想格式化一些东西:

  1. 我真的只是希望标题显示在我的第一个图表上 - 因此,如果有人能告诉我如何在子图中设置标题而不是为整个图表设置标题,那将可以正常工作。更好一点的是告诉我如何将其作为主图而不是子图。
  2. 我想将图例移到图表外,理想情况下位于图表空间下方,条目从左到右排列在几行上(有点像 Excel 所做的)。这可能太难了(因为代码太多而无法正常工作),在这种情况下,将图例放在右侧的图表之外将是下一个最佳选择(希望这是一个简单的 1 班轮)。
  3. 我想为每个轴命名

我非常感谢这里的社区提供的帮助,我非常享受我的 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)

我点击了他关于如何格式化图例的其他优秀答案的链接。这给出了最后一行工作代码......

【问题讨论】:

    标签: python matplotlib charts seaborn


    【解决方案1】:

    你有两个选择,

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

      df.plot(..., ax=plt.gca())
      
    • 先创建情节,然后修改它,

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

    有关如何将图例从坐标区中取出,请参阅How to put the legend out of the plot

    【讨论】:

      【解决方案2】:

      更好一点是告诉我如何将其设为主图表,而不是 成为一个次要情节。

      试试

      import matplotlib.pyplot as plt
      plt.figure()
      

      要定位您的图例,请使用 bb_to_anchor 参数;你的情节是 0 到 1 X 和 0 到 1 Y;图表下方的任何内容都是负 Y;图表左侧负 X;您可以使用ncol 添加列;并用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))
      

      我想为每个轴命名

      plt.xlabel()
      plt.ylabel()
      

      【讨论】:

      • 这看起来很有希望。我试过了,不认为我做得很对。我已将我的尝试编辑为上述问题。或者也许 plot.figure(0 没有做完全摆脱子情节发生所需要的事情。
      • 我也尝试过移动图例的建议 - 但这也不起作用。我想,一旦我们让标题和轴标签按预期方式工作,我也可以让图例发生变化。
      猜你喜欢
      • 1970-01-01
      • 2021-11-30
      • 2019-11-06
      • 2018-12-17
      • 2017-08-26
      • 2015-03-17
      • 2023-03-11
      • 2017-03-10
      • 2019-08-30
      相关资源
      最近更新 更多