python条形堆积图_python - Python堆叠条形图(带有pandas交叉表)以及FacetGrid,用于多列 - 堆栈内存溢出...

Seaborn将不会添加已关闭且已拒绝的问题中所述的堆叠式barplot功能

您需要自己处理,使用matplotlib子图并伪造数据框以适合您的需求。

引用:

我注意到seaborn.barplot不包含堆积的参数,并且我认为这将是一个很棒的功能。

我完全不同意,对不起。

因此该功能将不会很快出现。 正式。 但是,同一问题包含一种解决方法 (我尚未进行测试,一经使用计算机,我将尽快解决)

from __future__ import division

from textwrap import dedent

import colorsys

import numpy as np

from scipy import stats

import pandas as pd

import matplotlib as mpl

from matplotlib.collections import PatchCollection

import matplotlib.patches as Patches

import matplotlib.pyplot as plt

import warnings

from six import string_types

from six.moves import range

from seaborn import utils

from seaborn.axisgrid import FacetGrid

from seaborn.categorical import _BarPlotter, _CategoricalPlotter

from seaborn.categorical import factorplot as _factorplot

__all__ = ['countplot', 'factorplot', 'freqplot']

class _StackBarPlotter(_BarPlotter):

""" Stacked Bar Plotter

A modification of the :mod:`seaborn._BarPlotter` object with the added ability of

stacking bars either verticaly or horizontally. It takes the same arguments

as :mod:`seaborn._BarPlotter` plus the following:

Arguments

---------

stack : bool

Stack bars if true, otherwise returns equivalent barplot as

:mod:`seaborn._BarPlotter`.

"""

def draw_bars(self, ax, kws):

"""Draw the bars onto `ax`."""

# Get the right matplotlib function depending on the orientation

barfunc = ax.bar if self.orient == "v" else ax.barh

barpos = np.arange(len(self.statistic))

if self.plot_hues is None:

# Draw the bars

barfunc(barpos, self.statistic, self.width,

color=self.colors, align="center", **kws)

# Draw the confidence intervals

errcolors = [self.errcolor] * len(barpos)

self.draw_confints(ax,

barpos,

self.confint,

errcolors,

self.errwidth,

self.capsize)

else:

# Stack by hue

for j, hue_level in enumerate(self.hue_names):

barpos_prior = None if j == 0 else np.sum(self.statistic[:, :j], axis=1)

# Draw the bars

if self.orient == "v":

barfunc(barpos, self.statistic[:, j], self.nested_width,

bottom=barpos_prior, color=self.colors[j], align="center",

label=hue_level, **kws)

elif self.orient == "h":

barfunc(barpos, self.statistic[:, j], self.nested_width,

left=barpos_prior, color=self.colors[j], align="center",

label=hue_level, **kws)

# Draw the confidence intervals

if self.confint.size:

confint = self.confint[:, j] if j == 0 else np.sum(self.confint[:, :j], axis=1)

errcolors = [self.errcolor] * len(barpos)

self.draw_confints(ax,

barpos,

confint,

errcolors,

self.errwidth,

self.capsize)

def countplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None,

orient=None, color=None, palette=None, saturation=.75,

dodge=True, stack=False, ax=None, **kwargs):

""" Show the count of observations in each categorical bin using bars.

The count plot is a normalization of a histogram across categories, as opposed

to quantitative variables. The basic API and options are identical to those for

:func:`barplot`, so you can compare counts across nested variables.

Parameters

----------

x, y, hue : str or array-like, optional

Inputs for plotting long-form data.

data : DataFrame, array, or list of arrays, optional

Dataset for plotting. If `x` and `y` are absent, this is interpreted as wide-form.

Otherwise, data is expected to be long-form.

order, hue_order : list of str, optional

Order to plot the categorical levels, otherwise the levels are inferred from the

data object.

orient : {"v", "h"}, optional

Whether to plot bars vertically ("v") or horizontally ("h"). This can also be

inferred from the dtype of the input variables, but can be used to specify when the

"categorical" variable is a numeric or when plotting wide-form data.

color : matplotlib color, optional

Color for all of the elemnts, or seed for a gradient palette.

palette : palette name, list, or dict, optional

Colors to use for the different levels of the `hue` variable. Should be somthing that

can be interpreted by `color_palette()` or a dictionary mapping hue levels to

matplotlib colors.

saturation : float, optional

Proportion of the original saturation to draw colors. Large patches often look better

with slighlty desaturated colors, but set this to `1` if you want the plot colorss to

perfectly match the input color spec.

dodge : bool, optional

When hue nesting is used, whether elements should be shifted along the categorical axis.

stack : bool, optional

When hue nesting is used, whether elements should be stacked ontop of each other. Note,

dodge is set to False when stack is True.

ax : matplotlib.axes, optional

Axes object to draw the plot onto, otherwise uses the current axes.

**kwargs : Other keyword arguments are passed through to `plt.bar` at draw time

Examples

--------

.. plot::

:context: close-figs

>>> import schmeaborn as sns

>>> titanic = sns.load_dataset("titanic")

>>> ax = sns.freqplot(x="class", data=titanic)

Show frequencies for two categorical variables:

.. plot::

:context: close-figs

>>> ax = sns.freqplot(x="class", hue="who", data=titanic)

Plot the bars horizontally:

.. plot::

:context: close-figs

>>> ax = sns.freqplot(y="class", hue="who", data=titanic)

Plot categories stacked:

.. plot::

:context: close-figs

>>> ax = sns.freqplot(x="class", hue="who", stack=True, data=titanic)

"""

# Define parameters for barplot

if stack:

dodge = False

estimator = len

ci = None

n_boot = 0

units = None

errcolor = None

errwidth = None

capsize = None

# Check orientation by input

if x is None and y is not None:

orient = "h"

x = y

elif y is None and x is not None:

orient = "v"

y = x

elif x is not None and y is not None:

raise TypeError("Cannot pass values for both `x` and `y`")

else:

raise TypeError("Must pass values for either `x` or `y`")

bar_plot_func = _StackBarPlotter if stack else _BarPlotter

plotter = bar_plot_func(x, y, hue, data, order, hue_order,

estimator, ci, n_boot, units,

orient, color, palette, saturation,

errcolor, errwidth, capsize, dodge)

plotter.value_label = "count"

if ax is None:

ax = plt.gca()

plotter.plot(ax, kwargs)

return ax

def freqplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None,

orient=None, color=None, palette=None, saturation=.75,

dodge=True, stack=False, ax=None, **kwargs):

""" Show the frequency of observations in each categorical bin using bars.

The frequency plot is a normalization of a histogram across categories, as opposed

to quantitative variables. The basic API and options are identical to those for

:func:`barplot`, so you can compare counts across nested variables.

Parameters

----------

x, y, hue : str or array-like, optional

Inputs for plotting long-form data.

data : DataFrame, array, or list of arrays, optional

Dataset for plotting. If `x` and `y` are absent, this is interpreted as wide-form.

Otherwise, data is expected to be long-form.

order, hue_order : list of str, optional

Order to plot the categorical levels, otherwise the levels are inferred from the

data object.

orient : {"v", "h"}, optional

Whether to plot bars vertically ("v") or horizontally ("h"). This can also be

inferred from the dtype of the input variables, but can be used to specify when the

"categorical" variable is a numeric or when plotting wide-form data.

color : matplotlib color, optional

Color for all of the elemnts, or seed for a gradient palette.

palette : palette name, list, or dict, optional

Colors to use for the different levels of the `hue` variable. Should be somthing that

can be interpreted by `color_palette()` or a dictionary mapping hue levels to

matplotlib colors.

saturation : float, optional

Proportion of the original saturation to draw colors. Large patches often look better

with slighlty desaturated colors, but set this to `1` if you want the plot colorss to

perfectly match the input color spec.

dodge : bool, optional

When hue nesting is used, whether elements should be shifted along the categorical axis.

stack : bool, optional

When hue nesting is used, whether elements should be stacked ontop of each other. Note,

dodge is set to False when stack is True.

ax : matplotlib.axes, optional

Axes object to draw the plot onto, otherwise uses the current axes.

**kwargs : Other keyword arguments are passed through to `plt.bar` at draw time

Examples

--------

.. plot::

:context: close-figs

>>> import schmeaborn as sns

>>> titanic = sns.load_dataset("titanic")

>>> ax = sns.freqplot(x="class", data=titanic)

Show frequencies for two categorical variables:

.. plot::

:context: close-figs

>>> ax = sns.freqplot(x="class", hue="who", data=titanic)

Plot the bars horizontally:

.. plot::

:context: close-figs

>>> ax = sns.freqplot(y="class", hue="who", data=titanic)

Plot categories stacked:

.. plot::

:context: close-figs

>>> ax = sns.freqplot(x="class", hue="who", stack=True, data=titanic)

"""

# Define parameters for barplot

if stack:

dodge = False

estimator = len

ci = None

n_boot = 0

units = None

errcolor = None

errwidth = None

capsize = None

# Check orientation by input

if x is None and y is not None:

orient = "h"

x = y

elif y is None and x is not None:

orient = "v"

y = x

elif x is not None and y is not None:

raise TypeError("Cannot pass values for both `x` and `y`")

else:

raise TypeError("Must pass values for either `x` or `y`")

bar_plot_func = _StackBarPlotter if stack else _BarPlotter

plotter = bar_plot_func(x, y, hue, data, order, hue_order,

estimator, ci, n_boot, units,

orient, color, palette, saturation,

errcolor, errwidth, capsize, dodge)

# Safely calculate frequencies: NaN counts replaced by 0

plotter.statistic = np.nan_to_num(plotter.statistic)

if plotter.statistic.ndim == 1:

# Normalize statistic

plotter.statistic = plotter.statistic / np.nansum(plotter.statistic)

# Safety Check for proper normalization

err = f"Frequencies not properly normalized. \n {plotter.statistic} \n"

assert np.allclose(np.nansum(plotter.statistic), 1, rtol=1e-6), err

elif plotter.statistic.ndim > 1:

# Normalize row-stochastic

plotter.statistic = plotter.statistic / np.nansum(plotter.statistic, axis=1)[:, None]

# Safely check for proper normalization (ignore where full row is null)

sum_stats = np.nansum(plotter.statistic, axis=1)

# Safety Check for proper normalization

err = f"Frequencies not properly normalized. \n {plotter.statistic} \n"

assert np.allclose(sum_stats, 1, rtol=1e-6), err

else:

raise ValueError("Unable to count the combination of x and hue.")

plotter.value_label = "frequency"

if ax is None:

ax = plt.gca()

plotter.plot(ax, kwargs)

return ax

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值