美文网首页Python语言学习
Python数据可视化(三):条形图绘制

Python数据可视化(三):条形图绘制

作者: Davey1220 | 来源:发表于2021-04-25 21:18 被阅读0次

    使用matplotlib包绘制条形图

    # 导入所需的python包
    # Libraries
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    # 构建示例数据
    # Create dataset
    height = [3, 12, 5, 18, 45]
    bars = ('A', 'B', 'C', 'D', 'E')
    x_pos = np.arange(len(bars))
    
    x_pos
    array([0, 1, 2, 3, 4])
    

    绘制基础条形图

    # Create bars
    plt.bar(x_pos, height)
    
    # Create names on the x-axis
    plt.xticks(x_pos, bars)
    
    # Show graphic
    plt.show()
    
    image.png
    # Create a data frame
    df = pd.DataFrame ({
            'Group':  ['A', 'B', 'C', 'D', 'E'],
            'Value': [1,5,4,3,9]
    })
    
    df.head()
    
    Group Value
    0 A 1
    1 B 5
    2 C 4
    3 D 3
    4 E 9
    # 绘制水平条形图
    # Create horizontal bars
    plt.barh(y=df.Group, width=df.Value)
    
    image.png
    # 排序绘制水平条形图
    # Sort the table
    df = df.sort_values(by=['Value'])
    
    # Create horizontal bars
    plt.barh(y=df.Group, width=df.Value);
    
    # Add title
    plt.title('A simple barplot');
    
    image.png

    自定义条形图的颜色

    # Create bars with different colors
    plt.bar(x=df.Group, height=df.Value, color=['black', 'red', 'green', 'blue', 'cyan'])
    
    # Show graph
    plt.show()
    
    image.png
    # Create bars with blue edge color
    plt.bar(x=df.Group, height=df.Value, color=(0.1, 0.1, 0.1, 0.1), edgecolor='blue')
    
    # Add title and axis names
    plt.title('My title')
    plt.xlabel('categories')
    plt.ylabel('values')
    
    # Show graph
    plt.show()
    
    image.png

    添加误差棒

    # width of the bars
    barWidth = 0.3
    
    # Choose the height of the blue bars
    bars1 = [10, 9, 2]
    
    # Choose the height of the cyan bars
    bars2 = [10.8, 9.5, 4.5]
    
    # Choose the height of the error bars (bars1)
    yer1 = [0.5, 0.4, 0.5]
    
    # Choose the height of the error bars (bars2)
    yer2 = [1, 0.7, 1]
    
    # The x position of bars
    r1 = np.arange(len(bars1))
    r2 = [x + barWidth for x in r1]
    
    # Create blue bars
    plt.bar(x=r1, height=bars1, width = barWidth, color = 'blue', edgecolor = 'black', yerr=yer1, capsize=7, label='poacee')
    
    # Create cyan bars
    plt.bar(x=r2, height=bars2, width = barWidth, color = 'cyan', edgecolor = 'black', yerr=yer2, capsize=7, label='sorgho')
    
    # general layout
    plt.xticks([r + barWidth for r in range(len(bars1))], ['cond_A', 'cond_B', 'cond_C'])
    
    plt.ylabel('height')
    plt.legend()
    
    # Show graphic
    plt.show()
    
    image.png

    绘制堆叠条形图

    # 构建示例数据
    
    # set width of bars
    barWidth = 0.25
    
    # set heights of bars
    bars1 = [12, 30, 1, 8, 22]
    bars2 = [28, 6, 16, 5, 10]
    bars3 = [29, 3, 24, 25, 17]
    
    # Set position of bar on X axis
    r1 = np.arange(len(bars1))
    r2 = [x + barWidth for x in r1]
    r3 = [x + barWidth for x in r2]
    
    # 绘制分组条形图
    
    # Make the plot
    plt.bar(r1, bars1, color='#7f6d5f', width=barWidth, edgecolor='white', label='var1')
    plt.bar(r2, bars2, color='#557f2d', width=barWidth, edgecolor='white', label='var2')
    plt.bar(r3, bars3, color='#2d7f5e', width=barWidth, edgecolor='white', label='var3')
    
    # Add xticks on the middle of the group bars
    plt.xlabel('group', fontweight='bold')
    plt.xticks([r + barWidth for r in range(len(bars1))], ['A', 'B', 'C', 'D', 'E'])
    
    # Create legend & Show graphic
    plt.legend()
    plt.show()
    
    image.png
    # 绘制堆叠条形图
    
    # Heights of bars1 + bars2
    bars = np.add(bars1, bars2).tolist()
    
    # The position of the bars on the x-axis
    r = [0,1,2,3,4]
    
    # Names of group and bar width
    names = ['A','B','C','D','E']
    barWidth = 1
    
    # Create brown bars
    plt.bar(r, bars1, color='#7f6d5f', edgecolor='white', width=barWidth)
    # Create green bars (middle), on top of the first ones
    plt.bar(r, bars2, bottom=bars1, color='#557f2d', edgecolor='white', width=barWidth)
    # Create green bars (top)
    plt.bar(r, bars3, bottom=bars, color='#2d7f5e', edgecolor='white', width=barWidth)
    
    # Custom X axis
    plt.xticks(r, names, fontweight='bold')
    plt.xlabel("group")
    
    # Show graphic
    plt.show()
    
    image.png
    # Data
    r = [0,1,2,3,4]
    raw_data = {'greenBars': [20, 1.5, 7, 10, 5], 'orangeBars': [5, 15, 5, 10, 15],'blueBars': [2, 15, 18, 5, 10]}
    df = pd.DataFrame(raw_data)
    
    # From raw value to percentage
    totals = [i+j+k for i,j,k in zip(df['greenBars'], df['orangeBars'], df['blueBars'])]
    greenBars = [i / j * 100 for i,j in zip(df['greenBars'], totals)]
    orangeBars = [i / j * 100 for i,j in zip(df['orangeBars'], totals)]
    blueBars = [i / j * 100 for i,j in zip(df['blueBars'], totals)]
    
    # 绘制填充堆叠条形图
    
    # plot
    barWidth = 0.85
    names = ('A','B','C','D','E')
    
    # Create green Bars
    plt.bar(r, greenBars, color='#b5ffb9', edgecolor='white', width=barWidth, label="group A")
    # Create orange Bars
    plt.bar(r, orangeBars, bottom=greenBars, color='#f9bc86', edgecolor='white', width=barWidth, label="group B")
    # Create blue Bars
    plt.bar(r, blueBars, bottom=[i+j for i,j in zip(greenBars, orangeBars)], color='#a3acff', edgecolor='white', width=barWidth, label="group C")
    
    # Custom x axis
    plt.xticks(r, names)
    plt.xlabel("group")
    
    # Add a legend
    plt.legend(loc='upper left', bbox_to_anchor=(1,1), ncol=1)
    
    # Show graphic
    plt.show()
    
    image.png

    使用seaborn包绘制条形图

    # import libraries
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # set plot style: grey grid in the background:
    sns.set(style="darkgrid")
    
    # load dataset
    tips = sns.load_dataset("tips")
    tips.head()
    
    total_bill tip sex smoker day time size
    0 16.99 1.01 Female No Sun Dinner 2
    1 10.34 1.66 Male No Sun Dinner 3
    2 21.01 3.50 Male No Sun Dinner 3
    3 23.68 3.31 Male No Sun Dinner 2
    4 24.59 3.61 Female No Sun Dinner 4
    # Set the figure size
    plt.figure(figsize=(10, 7))
    
    # plot a bar chart
    # 绘制水平条形图
    sns.barplot(
        x="total_bill", 
        y="day", 
        data=tips, 
        estimator=sum, # estimator : function to estimate within each category
        ci=None, # ci : size of confidence intervals (if None, error bars will not be drawn)
        color='#69b3a2');
    
    image.png
    # Set the figure size
    plt.figure(figsize=(14, 10))
    
    # plot a bar chart
    sns.barplot(
        y="total_bill", 
        x="day", 
        data=tips, 
        estimator=sum, 
        ci=None, 
        color='skyblue');
    
    image.png
    # order参数设置条形图的顺序
    
    # Set the figure size
    plt.figure(figsize=(14, 10))
    
    # plot a bar chart with given order of bars ["Fri","Thur","Sun","Sat"]
    sns.barplot(
        x="total_bill", 
        y="day", 
        data=tips, 
        estimator=sum, 
        ci=None, 
        order=["Fri","Thur","Sun","Sat"], 
        color='#69b3a2'
    );
    
    image.png
    # 添加误差棒
    
    # Set the figure size
    plt.figure(figsize=(14, 8))
    
    # plot a bar chart
    ax = sns.barplot(x="day", y="total_bill", data=tips, estimator=np.mean, ci=85, capsize=.2, color='lightblue')
    
    image.png
    # 绘制分组条形图
    
    # set plot style: grey grid in the background:
    sns.set(style="darkgrid")
    
    # load dataset
    tips = sns.load_dataset("tips")
    
    # Set the figure size
    plt.figure(figsize=(8, 8))
    
    # grouped barplot
    sns.barplot(x="day", y="total_bill", hue="smoker", data=tips, ci=None);
    
    image.png
    # 自定义条形图颜色
    
    # Create an array with the colors you want to use
    colors = ["#69b3a2", "#4374B3"]
    sns.set_palette(sns.color_palette(colors))
    
    # Set the figure size
    plt.figure(figsize=(10, 10))
    
    # grouped barplot
    ax = sns.barplot(
        x="day", 
        y="total_bill", 
        hue="smoker", 
        data=tips, 
        ci=None
        )
    
    # Customize the axes and title
    ax.set_title("Smokers have bigger bills")
    ax.set_ylabel("Bill value")
    
    # Remove top and right borders
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    
    image.png
    # 绘制堆叠条形图
    
    import matplotlib.patches as mpatches
    
    # load dataset
    tips = sns.load_dataset("tips")
    
    # set plot style: grey grid in the background:
    sns.set(style="darkgrid")
    
    # set the figure size
    plt.figure(figsize=(14, 14))
    
    # top bar -> sum all values(smoker=No and smoker=Yes) to find y position of the bars
    total = tips.groupby('day')['total_bill'].sum().reset_index()
    
    # bar chart 1 -> top bars (group of 'smoker=No')
    bar1 = sns.barplot(x="day",  y="total_bill", data=total, color='darkblue')
    
    # bottom bar ->  take only smoker=Yes values from the data
    smoker = tips[tips.smoker=='Yes']
    
    # bar chart 2 -> bottom bars (group of 'smoker=Yes')
    bar2 = sns.barplot(x="day", y="total_bill", data=smoker, estimator=sum, ci=None,  color='lightblue')
    
    # add legend
    top_bar = mpatches.Patch(color='darkblue', label='smoker = No')
    bottom_bar = mpatches.Patch(color='lightblue', label='smoker = Yes')
    plt.legend(handles=[top_bar, bottom_bar])
    
    # show the graph
    plt.show()
    
    image.png
    # 绘制填充堆叠条形图
    
    import matplotlib.patches as mpatches
    
    # load dataset
    tips = sns.load_dataset("tips")
    
    # set the figure size
    plt.figure(figsize=(14, 14))
    
    # from raw value to percentage
    total = tips.groupby('day')['total_bill'].sum().reset_index()
    smoker = tips[tips.smoker=='Yes'].groupby('day')['total_bill'].sum().reset_index()
    smoker['total_bill'] = [i / j * 100 for i,j in zip(smoker['total_bill'], total['total_bill'])]
    total['total_bill'] = [i / j * 100 for i,j in zip(total['total_bill'], total['total_bill'])]
    
    # bar chart 1 -> top bars (group of 'smoker=No')
    bar1 = sns.barplot(x="day",  y="total_bill", data=total, color='darkblue')
    
    # bar chart 2 -> bottom bars (group of 'smoker=Yes')
    bar2 = sns.barplot(x="day", y="total_bill", data=smoker, color='lightblue')
    
    # add legend
    top_bar = mpatches.Patch(color='darkblue', label='smoker = No')
    bottom_bar = mpatches.Patch(color='lightblue', label='smoker = Yes')
    plt.legend(handles=[top_bar, bottom_bar])
    
    # show the graph
    plt.show()
    

    image.png

    参考来源: https://www.python-graph-gallery.com/barplot/

    相关文章

      网友评论

        本文标题:Python数据可视化(三):条形图绘制

        本文链接:https://www.haomeiwen.com/subject/efejrltx.html