使用matplotlib绘制高级图表

matplotlib除了可以绘制简单的图表,还可以绘制一些常见的高级图表,包括等高线图、矢量场流线图、棉棒图、哑铃图、甘特图、人口金字塔图、漏斗图、桑基图、树状图和华夫饼图。下面将对matplotlib中绘制高级图表的相关知识进行详细介绍。
1.绘制等高线:
等高线图是地形图上高程相等的相邻各点所连成的闭合曲线,它会将地面上海拔高度相同的点连成环线,之后将环线垂直投影到某一水平面上,并按照一定的比例缩绘到图纸上常见于山谷、山峰或梯度下降算法的场景。
在matplotlib中,pyplot可以使用contour)、contourf)函数分别绘制和填充等高线图。

import numpy as np
import matplotlib.pyplot as plt
def calcu_elevation(x1, y1):
    h = (1-x1/2  + x1 ** 5 + y1 ** 3)  * np.exp(-x1** 2 - y1** 2)
    return h
n = 256
x = np.linspace(-2, 2, n)
y = np.linspace(-2, 2, n)
x_grid, y_grid = np.meshgrid(x, y)
fig = plt.figure()
ax = fig.add_subplot(111)
con = ax.contour(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, colors='black')
ax.contourf(x_grid, y_grid, calcu_elevation(x_grid, y_grid), 8, alpha=0.75, cmap=plt.cm.copper)
ax.clabel(con, inline=True, fmt='%1.1f', fontsize=10)
ax.set_xticks([])
ax.set_yticks([])
plt.title('41')
plt.show()

  


2.绘制矢量场流线图:
在matplotlib中,pyplot可以使用streamplot()函数绘制矢量场流线图。

import numpy as np
import matplotlib.pyplot as plt
y, x = np.mgrid[0:5:50j, 0:5:50j]
u = x
v = y
fig = plt.figure()
ax = fig.add_subplot(111)
ax.streamplot(x, y, u, v)
plt.title('41')
plt.show()

  


3.绘制棉棒图:
棉棒图亦称为火柴杆图、大头针图或棒棒糖图,由线段(茎)与标记符号(茎头,默认为圆点)连接而成。其中,线段表示数据点到基线的距离,标记符号表示数据点的数值。棉棒图是柱形图或条形图的变形,主要用于比较标记符号的相对位置,而非比较线段的长度。
在matplotlib中,pyplot可以使用stem()函数绘制棉棒图。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
x = np.arange(1, 16)
y = np.array([5.9, 6.2, 6.7, 7.0, 7.0, 7.1, 7.2, 7.4, 
              7.5, 7.6, 7.7, 7.7, 7.7, 7.8, 7.9])
labels = np.array(['宝骏310', '宝马i3', '致享', '焕驰', '力帆530', 
                   '派力奥', '悦翔V3', '乐风RV', '奥迪A1', '威驰FS', 
                   '夏利N7', '启辰R30', '和悦A13RS', '致炫', '赛欧'])
fig = plt.figure(figsize=(10, 6), dpi= 80)
ax = fig.add_subplot(111)
markerline, stemlines, baseline = ax.stem(x, y, linefmt='--', 
                                          markerfmt='o', label='TestStem', use_line_collection=True)
plt.setp(stemlines, lw=1)
ax.set_title('不同品牌轿车的燃料消耗量 41', fontdict={'size':18})
ax.set_ylabel('燃料消耗量(L/km)')
ax.set_xticks(x)
ax.set_xticklabels(labels, rotation=60)
ax.set_ylim([0, 10])
for temp_x, temp_y in zip(x, y):
    ax.text(temp_x, temp_y + 0.5, s='{}'.format(temp_y), ha='center', va='bottom', fontsize=14)    
plt.show()

  


4.绘制哑铃图:
哑铃图又名DNA图(图表横着看像哑铃,竖着看像DNA),主要用于展示两个数据点之间的变化。哑铃图可以看作散点图与线形图的组合,适用于比较各种项目“前”与“后”的位置及项目的等级排序等场景。

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel(r"C:\Users\Administrator\Desktop\health.xlsx")
df.sort_values('pct_2014', inplace=True)
df.reset_index(inplace=True)
df = df.sort_values(by="index")
def newline(p1, p2, color='black'):
    ax = plt.gca()    
    l = mlines.Line2D([p1[0], p2[0]], [p1[1],p2[1]], color='skyblue')
    ax.add_line(l)
    return l
fig, ax = plt.subplots(1, 1, figsize=(8, 6))
ax.scatter(y=df['index'], x=df['pct_2013'], s=50, color='#0e668b', alpha=0.7)
ax.scatter(y=df['index'], x=df['pct_2014'], s=50, color='#a3c4dc', alpha=0.7)
for i, p1, p2 in zip(df['index'], df['pct_2013'], df['pct_2014' ]):
    newline([p1, i], [p2, i])
ax.set_title("2013年与2014年美国部分城市人口PCT指标的变化率 41", fontdict={'size':12})
ax.set_xlim(0, .25)
ax.set_xticks([.05, .1, .15, .20])
ax.set_xticklabels(['5%', '10%', '15%', '20%'])
ax.set_xlabel('变化率')
ax.set_yticks(df['index'])
ax.set_yticklabels(df['city'])
ax.grid(alpha=0.5, axis='x')
plt.show()

  


5.绘制甘特图:
甘特图亦称为横道图、条状图,它通过活动列表和时间刻度表示特定项目的顺序与持续时间。甘特图一般以时间为横轴、项目为纵轴,可以直观地展示每个项目的进展情况,以便于管理者了解项目的剩余任务及评估工作进度。

import numpy as np
import matplotlib.pyplot as plt
ticks = np.array(['报告提交', '数据分析', '数据录入', '实地执行', 
                  '问卷确定', '试访', '问卷设计', '项目确定'])
y_data = np.arange(1, 9)
x_data = np.array([0.5, 1.5, 1, 3, 0.5, 1, 1, 2])
fig,ax = plt.subplots(1, 1)
ax.barh(y_data, x_data, tick_label=ticks, left=[7.5, 6, 5.5, 3, 3, 2, 1.5, 0], color='#CD5C5C') 
[ax.spines[i].set_visible(False) for i in ['top', 'right']]
ax.set_title("任务甘特图 41")
ax.set_xlabel("日期")
ax.grid(alpha=0.5, axis='x')
plt.show()

  


6.绘制人口金字塔:
口金字塔图是指用类似古埃及金字塔的形象描述人口年龄与性别分布状况的图形,用于表现人口的现状及其发展类型。人口金字塔图一般以年龄为纵轴、人口数为横轴,按年龄中 自然顺序自下而上在纵轴左侧和右侧绘制并列的横向矩形条,纵轴左侧为男,右侧为女。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel(r'C:\Users\Administrator\Desktop\population.xlsx')
df_male = df.groupby(by='Gender').get_group('Male')
list_male = df_male['Number'].values.tolist()      #  将ndarray 转换为 list
df_female = df.groupby(by='Gender').get_group('Female')
list_female = df_female['Number'].values.tolist()  # 将ndarray 转换为 list
df_age = df.groupby('AgeGroup').sum()
count = df_age.shape[0]
y = np.arange(1, 11)
labels = []
for i in range(count):
    age = df_age.index[i]
    labels.append(age)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.barh(y, list_male, tick_label=labels, label=' 男', color='#6699FF') 
ax.barh(y, list_female, tick_label=labels, label=' 女', color='#CC6699')
ax.set_ylabel("年龄段(岁)")
ax.set_xticks([-100000, -75000, -50000, -25000, 0, 25000, 50000, 75000, 100000])
ax.set_xticklabels(['100000', '75000', '50000', '25000', 
                    '0', '25000', '50000', '75000', '100000'])
ax.set_xlabel("人数(个)")
ax.set_title('某城市人口金字塔 41')
ax.legend()
plt.show()

  


7.绘制漏斗图:
漏斗图亦称为倒三角图,它将数据呈现为几个阶段,每个阶段的占比总计为100%,从一个阶段到另一个阶段的数据自上而下逐渐降低。漏斗图通过展示业务各阶段数据的变化,可以帮助运营人员快速发现问题,适用于业务流程较为规范、周期长、环节多的流程分析的场景。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
num = 5
height = 0.5
x1 = np.array([1000, 500, 300, 200, 150])    
x2 = np.array((x1.max() - x1) / 2)
x3 = [i +j for i, j in zip(x1, x2)]
x3 = np.array(x3)
y = -np.sort(-np.arange(num))               
labels=['访问商品', '加购物车', '生成订单', '支付订单', '完成交易']
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)
rects1 = ax.barh(y, x3, height, tick_label=labels, color='g', alpha=0.5)
rects2 = ax.barh(y, x2, height, color='w', alpha=1) 
ax.plot(x3, y, 'black', alpha=0.7)
ax.plot(x2, y, 'black', alpha=0.7)
notes = []
for i in range(0, len(x1)):
    notes.append('%.2f%%'%((x1[i] / x1[0]) * 100))
for rect_one, rect_two, note in zip(rects1, rects2, notes):
    text_x = rect_two.get_width() + (rect_one.get_width() - rect_two.get_width()) / 2 - 30
    text_y = rect_one.get_y() + height / 2
    ax.text(text_x, text_y, note, fontsize=12)
ax.set_xticks([])
for direction in ['top', 'left', 'bottom', 'right']:
    ax.spines[direction].set_color('none')
ax.yaxis.set_ticks_position('none')
plt.title('41')
plt.show()

  


8.绘制桑基图:
桑基图亦称为桑基能量分流图、桑基能量平衡图,是一种特定类型的流程图,用于展示数据的“流动”变化。桑基图中包含若干条从左到右延展的分支,每条分支的宽度代表着数据流量的大小,且所有主支宽度的总和等于所有分支宽度的总和,常见于能源、材料成分等场景或金融领域。例如,中国2012年能源的流动状况如图8-17所示。
matplotlib.sankey模块中专门提供了表示桑基图的类Sankey,通过创建Sankey类的对象可以创建桑基图,之后可以调用add)方法为桑基图添加一些配置选项,最后调用finish()方法完成桑基图的绘制。下面将分步骤介绍桑基图的绘制过程,具体内容如下。
1.创建桑基图
matplotlib中使用构造方法Sankey)创建桑基图。
2.添加桑基图的选项
Sankey类对象可以调用add)方法为桑基图添加数据流量、标签等选项。
3.返回桑基图绘制完成的对象
Sankey类对象在添加数据之后需要调用finish)方法完成绘制,并返回包含多个桑基子图的列表。桑基子图包含以下字段。
·patch:表示桑基子图的轮廓。
·flows:表示流量值(输入为正,输出为负)。
·angles:表示箭头角度的列表。
·tips:表示流路径的尖端或凹陷位置的数组,其中每一行是一个(x,y)。
·text:表示中心标签的Text 实例。
·texts:表示流分支标签的Text 实例。

import matplotlib.pyplot as plt
from matplotlib.sankey import Sankey
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
flows = [0.7, 0.3, -0.3, -0.1, -0.3, -0.1, -0.1, -0.1]
labels = ["工资", "副业", "生活", "购物", "深造", "运动", "其他", "买书"]
orientations = [1, 1, 0, -1, 1, -1, 1, 0]
sankey = Sankey()
sankey.add(flows=flows,                   
           labels=labels,                   
           orientations=orientations,       
           color="black",                   
           fc="lightgreen",                 
           patchlabel="生活消费 ",          
           alpha=0.7)                       
diagrams = sankey.finish()
diagrams[0].texts[4].set_color("r")         
diagrams[0].texts[4].set_weight("bold")     
diagrams[0].text.set_fontsize(20)           
diagrams[0].text.set_fontweight("bold")     
plt.title("日常生活开支的桑基图 41")
plt.show()

  

9.绘制树状图:
树状图亦称为树枝状图,是一种通过树状结构描述父子成员层次结构的图形。树形图的形状一般是一个上下颠倒的树,其根部是一个没有父成员的根节点,之后从根节点开始用线连接子成员,使子成员变为子节点,直至线的末端为没有子成员的树叶节点为止。树形图用于说明成员之间的关系和连接,常见于分类学、进化科学、企业组织管理等领域。

import pandas as pd
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as shc
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel(r'C:\Users\Administrator\Desktop\USArrests.xlsx')
plt.figure(figsize=(10, 6), dpi= 80)
plt.title("美国各州犯罪案件的树状图 41", fontsize=12)
dend = shc.dendrogram(shc.linkage(df[['Murder', 'Assault', 'UrbanPop']], method='ward'), 
                      labels=df.State.values, color_threshold=100)
plt.xticks(fontsize=10.5)
plt.ylabel('案例数量(个)')
plt.show()

 

10.:绘制华夫饼图:
夫饼图亦称为直角饼图,它是饼图的变体,可以直观展示部分与整体的比例。华夫饼图一般由100个方格组成,其中每个方格代表1%,方格不同的颜色代表不同的分类,常见于比较同类型指标完成比例的场景,例如电影上座率、公司业务实际完成率等。

import matplotlib.pyplot as plt
from pywaffle import Waffle
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
plt.figure(FigureClass=Waffle, rows=10, columns=10, 
           values=[95, 5],vertical=True, colors=['#20B2AA', '#D3D3D3'], 
           title={'label': '41 电影《少年的你》上座率'}, 
           legend={'loc': 'upper right', 'labels': ['占座', '空座']}
)
plt.show()

  

————————————————
版权声明:本文为CSDN博主「之火」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_55680183/article/details/123915634

猜你喜欢

转载自blog.csdn.net/zy1620454507/article/details/128383554