使用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/
网友评论