目錄
單一柱狀圖
分組柱狀圖
堆積柱狀圖
百分比柱狀圖
均值柱狀圖
不等寬柱狀圖
有序柱狀圖
條形圖
發散條形圖
在條上添加標簽的發散條形圖
基礎棒棒糖圖1
基礎棒棒糖圖2
【聲明】:未經版權人書面許可,任何單位或個人不得以任何形式復制、發行、出租、改編、匯編、傳播、展示或利用本博客的全部或部分內容,也不得在未經版權人授權的情況下將本博客用于任何商業目的。但版權人允許個人學習、研究、欣賞等非商業性用途的復制和傳播。非常推薦大家學習《Python數據可視化科技圖表繪制》這本書籍。
單一柱狀圖
import pandas as pd # 導入pandas庫并簡寫為pd
import matplotlib.pyplot as plt # 導入matplotlib.pyplot模塊并簡寫為plt# 自定義數據集
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value': [10, 15, 7, 12, 8]}) # 創建一個包含類別和值的DataFrame
# 查看數據結構
print("數據結構:")
print(data)# 創建單一柱狀圖
plt.figure(figsize=(6, 4)) # 創建圖形對象,并設置圖形大小
plt.bar(data['category'], data['value'], color='steelblue')
# 繪制柱狀圖,指定x軸為類別,y軸為值,柱狀顏色為鋼藍色
plt.xlabel('Category') # 設置x軸標簽
plt.ylabel('Value') # 設置y軸標簽
plt.title('Single Bar Chart') # 設置圖表標題# 添加網格線,采用虛線,設置為灰色,透明度為0.5
plt.grid(linestyle='-', color='gray', alpha=0.5)# 保存圖片
plt.savefig('P93單一柱狀圖.png', dpi=600, transparent=True)
plt.show()

分組柱狀圖
import pandas as pd # 導入pandas庫并簡寫為pd
import matplotlib.pyplot as plt # 導入matplotlib.pyplot模塊并簡寫為plt# 自定義一個包含多列數據的數據框DataFrame,包含類別和多列值
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value1': [10, 15, 7, 12, 8], 'value2': [6, 9, 5, 8, 4],'value3': [3, 5, 2, 4, 6], 'value4': [9, 6, 8, 3, 5]})
# 查看數據框
print("Data Structure:")
print(data) # 輸出如圖43所示# 創建分組柱狀圖
data.plot(x='category', kind='bar', figsize=(6, 4))
# 使用DataFrame的plot方法繪制分組柱狀圖
# 指定x軸為'category'列,圖表類型為'bar',圖形大小為(6,4)
plt.xlabel('Category') # 設置x軸標簽
plt.xticks(rotation=0) # 旋轉x軸文本,使其水平顯示
plt.ylabel('Value') # 設置y軸標簽
plt.title('Grouped Bar Chart') # 設置圖表標題
plt.legend(title='Values') # 添加圖例,并設置標題為'Values'# 保存圖片
plt.savefig('P94分組柱狀圖.png', dpi=600, transparent=True)
plt.show()

堆積柱狀圖
import pandas as pd
import matplotlib.pyplot as plt# 自定義一個包含多列數據的數據框DataFrame,包含類別和多列值
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value1': [10, 15, 7, 12, 8], 'value2': [6, 9, 5, 8, 4],'value3': [3, 5, 2, 4, 6], 'value4': [9, 6, 8, 3, 5]})# 查看數據框
print("Data Structure:")
print(data)# 將'category' 列設置為索引,并創建堆積柱狀圖
data.set_index('category').plot(kind='bar', stacked=True, figsize=(6, 4))
plt.xlabel('Category')
plt.ylabel('Value')
plt.title('Stacked Bar Chart')
plt.xticks(rotation=0)# 添加圖例,并設置標題為'Values',并放置在圖的右側
plt.legend(title='Values', loc='center left', bbox_to_anchor=(1, 0.5))# 保存圖片時自動調整邊界
plt.savefig('P95堆積柱狀圖.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

百分比柱狀圖
import pandas as pd # 導入pandas庫并簡寫為pd
import matplotlib.pyplot as plt # 導入matplotlib.pyplot模塊并簡寫為plt# 自定義一個包含多列數據的數據框DataFrame,包含類別和多列值
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value1': [10, 15, 7, 12, 8], 'value2': [6, 9, 5, 8, 4],'value3': [3, 5, 2, 4, 6], 'value4': [9, 6, 8, 3, 5]})
# 查看數據框
print("Data Structure:")
print(data) # 輸出如圖43所示# 創建百分比柱狀狀圖
# 復制數據集到新的DataFrame以便進行百分比計算
data_percentage = data.copy()# 計算每個數值列的百分比,除以每行的總和并乘以100
data_percentage.iloc[:, 1:] = data_percentage.iloc[:, 1:].div(data_percentage.iloc[:, 1:].sum(axis=1), axis=0) * 100data_percentage.set_index('category').plot(kind='bar',stacked=True, figsize=(6, 4))
# 創建百分比堆疊柱狀圖,設置索引為'category'列,
# 圖表類型為'bar',堆積模式為True,圖形大小為(6,4)plt.xlabel('Category') # 設置x軸標簽
plt.ylabel('Percentage') # 設置y軸標簽
plt.title('Percentage Stacked Bar Chart') # 設置圖表標題
plt.xticks(rotation=0) # 旋轉x軸文本,使其水平顯示# 添加圖例,并設置標題為'Values',并放置在圖的右側
plt.legend(title='Values', loc='center left', bbox_to_anchor=(1, 0.5))# 保存圖片時自動調整邊界
plt.savefig('P97百分比柱狀圖.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

均值柱狀圖
import pandas as pd # 導入pandas庫并簡寫為pd
import matplotlib.pyplot as plt # 導入matplotlib.pyplot模塊并簡寫為plt
import seaborn as sns # 導入seaborn庫并簡寫為sns# 創建創建一個包含類別、值和標準差的DataFrame數據集
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value': [10, 15, 7, 12, 8], 'std': [1, 2, 1.5, 1.2, 2.5]})# 計算每個類別的均值和標準差
mean_values = data['value']
std_values = data['std']colors = sns.color_palette("Set1", n_colors=len(data)) # 創建顏色調色板
# 創建均值柱狀圖
plt.figure(figsize=(6, 4)) # 創建圖形對象,并設置圖形大小
bars = plt.bar(data['category'], mean_values, color=colors)
# 繪制柱狀圖,指定x軸為類別,y軸為均值,柱狀顏色為顏色調色板中的顏色# 添加誤差線
for i, (bar, std) in enumerate(zip(bars, std_values)):plt.errorbar(bar.get_x() + bar.get_width() / 2, bar.get_height(),# 在柱狀圖的中心位置添加誤差線yerr=std, fmt='none', color='black', ecolor='gray',# 設置誤差線的樣式和顏色capsize=5, capthick=2) # 設置誤差線的帽子大小和線寬
# 添加標題和標簽
plt.xlabel('Category') # 設置x軸標簽
plt.ylabel('Mean Value') # 設置y軸標簽
plt.title('Mean Bar Chart with Error Bars') # 設置圖表標題# 設置網格線的樣式、顏色和透明度
plt.grid(axis='both', linestyle='-', color='gray', alpha=0.5)# 保存圖片時自動調整邊界
plt.savefig('P98均值柱狀圖.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

不等寬柱狀圖
import pandas as pd
import matplotlib.pyplot as plt# 創建數據集
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value': [10, 15, 7, 12, 8],'width': [0.8, 0.4, 1.0, 0.5, 0.9]})
print("數據結構:"), print(data) # 查看數據框,如圖48所示# 自定義顏色列表,每個柱子使用不同的配色
colors = ['red', 'green', 'blue', 'orange', 'purple']
# 創建不等寬柱狀圖
plt.figure(figsize=(6, 4))
for i in range(len(data)):plt.bar(data['category'][i], data['value'][i],width=data['width'][i], color=colors[i])# 添加標題和標簽
plt.xlabel('Category')
plt.ylabel('Value')
plt.title('Unequal Width Bar Chart')# 設置網格線
plt.grid(axis='both', linestyle='-', color='gray', alpha=0.5)# 保存圖片時自動調整邊界
plt.savefig('P99不等寬柱狀圖.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

有序柱狀圖
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as patchesdf_raw = pd.read_csv(r"E:\PythonProjects\experiments_figures\繪圖案例數據\mpg_ggplot2.csv") # 讀取原始數據
# 按制造商分組,并計算每個制造商的平均城市里程
df = df_raw[['cty', 'manufacturer']].groupby('manufacturer').apply(lambda x: x.mean())# 按城市里程排序數據
df.sort_values('cty', inplace=True) # 按城市里程排序數據
df.reset_index(inplace=True) # 重置索引# 繪圖
# 創建圖形和坐標軸對象
fig, ax = plt.subplots(figsize=(10, 6), facecolor='white', dpi=80)# 使用vlines繪制垂直線條,代表城市里程
ax.vlines(x=df.index, ymin=0, ymax=df.cty, color='firebrick',alpha=0.7, linewidth=20)# 添加文本注釋
# 在每個條形的頂部添加數值標簽
for i, cty in enumerate(df.cty):ax.text(i, cty + 0.5, round(cty, 1), horizontalalignment='center')# 設置標題、標簽、刻度和y軸范圍
ax.set_title('Bar Chart for Highway Mileage',fontdict={'size': 18}) # 設置標題
ax.set(ylabel='Miles Per Gallon', ylim=(0, 30)) # 設置y軸標簽和范圍
plt.xticks(df.index, df.manufacturer.str.upper(), rotation=60,horizontalalignment='right', fontsize=8) # 設置x軸標簽# 添加補丁以為X軸標簽著色
# 創建兩個補丁對象,用于著色X軸標簽的背景
p1 = patches.Rectangle((.57, -0.005), width=.33, height=.13, alpha=.1,facecolor='green', transform=fig.transFigure) # 創建綠色補丁
p2 = patches.Rectangle((.124, -0.005), width=.446, height=.13, alpha=.1,facecolor='red', transform=fig.transFigure) # 創建紅色補丁
# 將補丁對象添加到圖形上
fig.add_artist(p1) # 添加綠色補丁
fig.add_artist(p2) # 添加紅色補丁# 保存圖片時自動調整邊界
plt.savefig('P100有序柱狀圖.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

條形圖
import pandas as pd
import matplotlib.pyplot as plt
import randomdf_raw = pd.read_csv(r"E:\PythonProjects\experiments_figures\繪圖案例數據\mpg_ggplot2.csv") # 導入數據
# 準備數據
df = df_raw.groupby('manufacturer').size().reset_index(name='counts')
# 按制造商分組并計算每個制造商的數量
n = df['manufacturer'].unique().__len__() + 1 # 獲取唯一制造商的數量
all_colors = list(plt.cm.colors.cnames.keys()) # 獲取所有可用的顏色
random.seed(100) # 設置隨機種子,確保每次運行生成的顏色相同
c = random.choices(all_colors, k=n) # 從顏色列表中隨機選擇 n 個顏色# 繪制條形圖
plt.figure(figsize=(10, 6), dpi=80) # 設置圖形大小
plt.barh(df['manufacturer'], df['counts'], color=c,height=.5) # 繪制水平條形圖,X軸為counts,Y軸為manufacturer
for i, val in enumerate(df['counts'].values): # 遍歷每個條形并在右側添加數值標簽plt.text(val, i, float(val), horizontalalignment='left',verticalalignment='center', fontdict={'fontweight': 500, 'size': 12})# 添加修飾
plt.gca().invert_yaxis() # 反轉Y軸,確保順序正確顯示
plt.title("Number of Vehicles by Manufacturers",fontsize=18) # 設置標題和字體大小
plt.xlabel('# Vehicles') # 設置x軸標簽
plt.xlim(0, 45) # 設置x軸的范圍# 保存圖片時自動調整邊界
plt.savefig('P103條形圖.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

發散條形圖
import pandas as pd
import matplotlib.pyplot as pltdf = pd.read_csv(r"E:\PythonProjects\experiments_figures\繪圖案例數據\mtcars1.csv") # 讀取數據# 提取'mpg'列作為x變量,并計算其標準化值
x = df.loc[:, ['mpg']]
df['mpg_z'] = (x - x.mean()) / x.std()
# 根據'mpg_z'列的值確定顏色
df['colors'] = ['red' if x < 0 else 'green' for x in df['mpg_z']]df.sort_values('mpg_z', inplace=True) # 根據'mpg_z'列的值對數據進行排序
df.reset_index(inplace=True) # 重置索引# 繪制圖形 ①
plt.figure(figsize=(10, 8), dpi=600)
plt.hlines(y=df.index, xmin=0, xmax=df.mpg_z, color=df.colors,alpha=0.4, linewidth=5)# 圖形修飾
plt.gca().set(ylabel='$Model$', xlabel='$Mileage$') # 設置y軸和x軸標簽
plt.yticks(df.index, df.cars, fontsize=12) # 設置y軸刻度標簽和字體大小
plt.title('Diverging Bars of Car Mileage',fontdict={'size': 20}) # 設置標題和字體大小
plt.grid(linestyle='--', alpha=0.5) # 添加網格線# 保存圖片時自動調整邊界
plt.savefig('P104發散條形圖.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

在條上添加標簽的發散條形圖
import pandas as pd
import matplotlib.pyplot as pltdf = pd.read_csv(r"E:\PythonProjects\experiments_figures\繪圖案例數據\mtcars1.csv") # 讀取數據# 提取'mpg'列作為x變量,并計算其標準化值
x = df.loc[:, ['mpg']]
df['mpg_z'] = (x - x.mean()) / x.std()
# 根據'mpg_z'列的值確定顏色
df['colors'] = ['red' if x < 0 else 'green' for x in df['mpg_z']]df.sort_values('mpg_z', inplace=True) # 根據'mpg_z'列的值對數據進行排序
df.reset_index(inplace=True) # 重置索引plt.figure(figsize=(10, 8), dpi=600)
plt.hlines(y=df.index, xmin=0, xmax=df.mpg_z)# 在條形上添加標簽
for x, y, tex in zip(df.mpg_z, df.index, df.mpg_z):t = plt.text(x, y, round(tex, 2),horizontalalignment='right' if x < 0 else 'left',verticalalignment='center',fontdict={'color': 'red' if x < 0 else 'green', 'size': 12})# 圖形修飾
plt.gca().set(ylabel='$Model$', xlabel='$Mileage$') # 設置y軸和x軸標簽
plt.yticks(df.index, df.cars, fontsize=12) # 設置y軸刻度標簽和字體大小
plt.title('Diverging Bars of Car Mileage',fontdict={'size': 20}) # 設置標題和字體大小
plt.grid(linestyle='--', alpha=0.5) # 添加網格線
plt.xlim(-2.5, 2.5) # 設置x軸范圍# 保存圖片時自動調整邊界
plt.savefig('P105在條上添加標簽的發散條形圖.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

基礎棒棒糖圖1
import matplotlib.pyplot as plt
import numpy as np# 創建數據
np.random.seed(19781101) # 固定隨機種子,以便結果可復現
values = np.random.uniform(size=40) # 生成40個0到1之間的隨機數
positions = np.arange(len(values)) # 生成與values長度相同的位置數組plt.figure(figsize=(10, 6)) # 創建圖形窗口大小# 繪制沒有標記的圖形
plt.subplot(2, 2, 1) # 創建一個2x2的子圖矩陣,并選擇第1個子圖
plt.stem(values, markerfmt=' ') # 繪制棒棒糖圖,沒有標記
plt.title("No Markers") # 設置子圖標題# 改變顏色、形狀、大小和邊緣
plt.subplot(2, 2, 2) # 選擇第2個子圖
(markers, stemlines, baseline) = plt.stem(values) # 獲取棒棒糖圖的組件
plt.setp(markers, marker='D', markersize=6,markeredgecolor="orange", markeredgewidth=2) # 設置標記屬性
plt.title("Custom Markers") # 設置子圖標題# 繪制沒有標記的圖形(水平展示)
plt.subplot(2, 2, 3) # 選擇第3個子圖
plt.hlines(y=positions, xmin=0, xmax=values, color='skyblue') # 繪制水平線
plt.plot(values, positions, ' ') # 繪制數據點
plt.title("Horizontal No Markers") # 設置子圖標題# 改變顏色、形狀、大小和邊緣進行水平展示
plt.subplot(2, 2, 4) # 選擇第4個子圖
plt.hlines(y=positions, xmin=0, xmax=values, color='skyblue') # 繪制水平線
plt.plot(values, positions, 'D', markersize=6,markeredgecolor="orange", markerfacecolor="orange",markeredgewidth=2) # 繪制數據點,并設置屬性
plt.title("Horizontal Custom Markers") # 設置子圖標題plt.tight_layout() # 自動調整子圖布局# 保存圖片時自動調整邊界
plt.savefig('P107基礎棒棒糖圖1.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

基礎棒棒糖圖2
import pandas as pd
import matplotlib.pyplot as pltdf_raw = pd.read_csv(r"E:\PythonProjects\experiments_figures\繪圖案例數據\mpg_ggplot2.csv") # 讀取原始數據
# 按制造商分組,并計算每個制造商的平均城市里程
df = df_raw[['cty', 'manufacturer']].groupby('manufacturer').apply(lambda x: x.mean())# 按城市里程排序數據
df.sort_values('cty', inplace=True)
df.reset_index(inplace=True)# 繪圖
fig, ax = plt.subplots(figsize=(12, 8), dpi=80)# 使用vlines繪制垂直線條,代表城市里程的起始點
ax.vlines(x=df.index, ymin=0, ymax=df.cty, color='firebrick',alpha=0.7, linewidth=2)# 使用scatter繪制lollipop的圓點
ax.scatter(x=df.index, y=df.cty, s=75, color='firebrick', alpha=0.7)# 設置標題、標簽、刻度和y軸范圍
ax.set_title('Lollipop Chart for Highway Mileage',fontdict={'size': 20}) # 設置標題
ax.set_ylabel('Miles Per Gallon') # 設置y軸標簽
ax.set_xticks(df.index) # 設置x軸刻度位置
ax.set_xticklabels(df.manufacturer.str.upper(), rotation=60,fontdict={'horizontalalignment': 'right', 'size': 12}) # 設置x軸刻度標簽
ax.set_ylim(0, 30) # 設置y軸范圍# 添加注釋
# 使用for循環遍歷DataFrame的每一行,并在每個lollipop的頂部添加城市里程的數值
for row in df.itertuples():ax.text(row.Index, row.cty + 0.5, s=round(row.cty, 2),horizontalalignment='center', verticalalignment='bottom',fontsize=14)# 保存圖片時自動調整邊界
plt.savefig('P107基礎棒棒糖圖2.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()
