带误差线的条图

当直条用于显示样本统计量时,往往需要加绘相应指标的可信区间。

seaborn.barplot(

x, y, hue : names of variables in data
data : DataFrame
order, hue_order : 分类变量/hue变量各类别取值的绘图顺序

可信区间计算:
ci = 95 : float or “sd” or None, 希望绘制的可信区间宽度
n_boot = 1000 : 计算CI时的bootstrap抽样次数。
units : 用于确定抽样单元大小的变量。

误差条格式:
errcolor = ‘0.26’ : CI线段的颜色,matplotlib color
errwidth : CI线段的粗细,float
capsize : 误差条顶端的宽度,占直条绘图区的比例,float
)

sns.barplot(x = ccss.s4, y = ccss.s3)

Python误差线图的误差数据是怎么得的 误差条图spss_嵌套

sns.barplot(x = ccss.s4, y = ccss.s3, color = 'c',
            errcolor = 'b', errwidth = '2', capsize = .1)

Python误差线图的误差数据是怎么得的 误差条图spss_Python数据可视化_02

# 如何不绘制CI
sns.barplot(x = ccss.s4, y = ccss.s3, ci = None)
plt.xlabel("S4:教育程度")
plt.ylabel("S3:年龄均值")

Python误差线图的误差数据是怎么得的 误差条图spss_css_03

用直条表示中位数、标准差等特殊统计量

https://docs.scipy.org/doc/numpy-1.14.5/reference/routines.statistics.html

import numpy as np

sns.barplot(x = ccss.s4, y = ccss.s3, estimator = np.median)

Python误差线图的误差数据是怎么得的 误差条图spss_ci_04

sns.barplot(x = ccss.s4, y = ccss.s3, estimator = np.std)

Python误差线图的误差数据是怎么得的 误差条图spss_嵌套_05

分组条图

sns.barplot(x = ccss.s4, y = ccss.s3, hue = ccss.s2)

Python误差线图的误差数据是怎么得的 误差条图spss_嵌套_06

# 存在嵌套分组
sns.barplot(x = ccss.Qs9, y = ccss.s3, hue = ccss.Ts9)

Python误差线图的误差数据是怎么得的 误差条图spss_Python数据可视化_07

# 存在嵌套分组时不调整直条宽度
sns.barplot(x = ccss.Qs9, y = ccss.s3, hue = ccss.Ts9, dodge = False)

Python误差线图的误差数据是怎么得的 误差条图spss_Python数据可视化_08

堆积条图

堆积条图在matplotlib中没有命令直接实现,但可以通过重叠作图方式加以绘制:

方法一:先绘制全部类别的的累积直条,然后依次绘制n-1、n-2…个类别的累积直条,最终形成堆积条图的效果。
方法二:利用plt.plot()的bottom参数,依次将新类别的直条叠加在已有直条上方。

上述方法二更常用,且结合Pandas的汇总功能和seabon模块的绘图功能,实现堆积条图已经非常方便。

# 利用Pandas的汇总功能生成所需汇总数据
tmpdf = pd.crosstab(index = ccss.s0, columns = ccss.s4)
tmpdf

Python误差线图的误差数据是怎么得的 误差条图spss_ci_09

# 取出所需的汇总行
tmpdf.loc[['上海']]

Python误差线图的误差数据是怎么得的 误差条图spss_ci_10

# 取出所需的汇总行(序列格式)
tmpdf.loc['上海']

Python误差线图的误差数据是怎么得的 误差条图spss_嵌套_11

# 分三次使用seaborn绘制三个类别的直条,并依次叠加
sns.barplot(data = tmpdf.loc[['上海']], color = 'b', label = '上海')
sns.barplot(data = tmpdf.loc[['北京']], bottom = tmpdf.loc['上海'], 
            color = 'c', label = '北京')
# 注意bottom参数需要累加已有的所有直条类别高度
sns.barplot(data = tmpdf.loc[['广州']], 
            bottom = tmpdf.loc['北京'] + tmpdf.loc['上海'], 
            color = 'y', label = '广州')
plt.legend()

Python误差线图的误差数据是怎么得的 误差条图spss_嵌套_12

# 使用循环程序自动生成图形
tmpdf = pd.crosstab(index = ccss.s0, columns = ccss.s4)
colorstep0 = 1/len(tmpdf.index)
for i in range(len(tmpdf.index)):
    if i == 0:
        colorstep = colorstep0 / 2 # 避免最终出现纯白色直条
        sns.barplot(data = tmpdf.loc[[tmpdf.index[i]]], 
                    color = str(colorstep), label = tmpdf.index[i])
        base = tmpdf.loc[tmpdf.index[i]]
    else:
        sns.barplot(data = tmpdf.loc[[tmpdf.index[i]]],
                    color = str(colorstep), bottom = base, 
                    label = tmpdf.index[i])
        base = base + tmpdf.loc[tmpdf.index[i]]
    colorstep = colorstep + colorstep0 
plt.legend()

Python误差线图的误差数据是怎么得的 误差条图spss_ci_13

# 使用sns.histplot()近似绘制堆积条图(实际上是堆积直方图)
# 但是该函数无法指定order或者row_order参数(因为不存在真正的分类轴)
sns.histplot(data = ccss, x = 's4', hue = 's0', multiple="stack",
            hue_order = ['广州', '上海', '北京'])

Python误差线图的误差数据是怎么得的 误差条图spss_Python数据可视化_14

百分条图

基本绘制思路和堆积条图相同,但需要将数据计算为相应的百分比。

python中没有为多选题专门提供分析/绘图功能,需要自行完成所需指标的汇总计算。

pd.crosstab(index = ccss.s0, columns = ccss.s4, normalize = "columns")

Python误差线图的误差数据是怎么得的 误差条图spss_css_15

tmpdf = pd.crosstab(index = ccss.s0, columns = ccss.s4, 
                    normalize = "columns")
colorstep0 = 1/len(tmpdf.index)
for i in range(len(tmpdf.index)):
    if i == 0:
        colorstep = colorstep0 / 2
        sns.barplot(data = tmpdf.loc[[tmpdf.index[i]]], 
                    color = str(colorstep), label = tmpdf.index[i])
        base = tmpdf.loc[tmpdf.index[i]]
    else:
        sns.barplot(data = tmpdf.loc[[tmpdf.index[i]]],
                    color = str(colorstep), bottom = base, 
                    label = tmpdf.index[i])
        base = base + tmpdf.loc[tmpdf.index[i]]
    colorstep = colorstep + colorstep0 
plt.legend()

Python误差线图的误差数据是怎么得的 误差条图spss_Python数据可视化_16

# 使用sns.histplot()近似绘制百分条图(实际上是百分直方图)
# 但是该函数无法指定order或者row_order参数(因为不存在真正的分类轴)
sns.histplot(data = ccss, x = 's4', hue = 's0', multiple="fill",
            hue_order = ['广州', '上海', '北京'])

Python误差线图的误差数据是怎么得的 误差条图spss_ci_17