Bootstrap

Python基础教程——10个可视化案例实操,一图胜千言!

让数据集改变你的思维

数据可视化是数据科学家传达洞见和讲述数据故事的关键工具。作为 Python 开发者,我们拥有丰富的可视化库和工具,能够创建各种引人入胜的图表。本文将探索一些鲜为人知但实用的可视化类型,如桑基图(Sankey Diagrams)、脊线图(Ridge Plots)、内嵌图(Insets)、雷达图(Radar Chart)和词云图(Word Cloud Plots)。我们将主要使用流行的 Matplotlib、Seaborn 和 Plotly 这些 Python 库来实现这些有趣的可视化效果,让你的数据讲述更加生动有趣。

我们将使用形状、大小、颜色、方向、面积和标记符号等属性,为十种不同的使用案例创建绘图。在每个使用案例中,我们的目标都是创建有效、高效和美观的可视化效果。描述这些词语在图表中的含义如下:

(a) 有效:图表中包含了所有需要传达的信息
(b) 高效:图表中没有多余的数据
© 美观:图表以清晰的方式展示数据,吸引注意力

所有图表都是二维图,因为从效率和效果的角度来看,二维图比三维图更清晰易懂,同时更容易描绘距离。文中还将介绍每个用例的代码,并讨论代码和图表中的要点。

用例 1

描述大学之间学生交流流动的桑基图。

这些图展示了资源流动的情况,下面的代码展示了用例的实现。字符 “A” 代表第一所大学,字符 “B” 代表第二所大学。数字 3、4、5 分别代表不同的系,即{Statistics, Math, Physics}。第 25 行创建了一个图表,其中 nodelink是字典。node 使用的 label 对象由唯一的 Depts 院系组成,而 link 使用的两个列表分别由 sending"院系的索引和 acepting 院系的索引组成。

import pandas as pd  
import plotly.graph_objects as gr  
data = {
     
    'Sending_Dept':   ['5A', '4A', '5B', '5A', '4B', '4A', '3A', '3B', '3A', '3B', '3A', '3B'],  
    'Accepting_Dept': ['4B', '5B', '5A', '5B', '4A', '4B', '5B', '5A', '4B', '4A', '3B', '3A'],  
    'FlowValue': [1, 3, 4, 3, 4, 4, 1, 1, 3, 2, 5, 3]  
}  
df = pd.DataFrame(data)  
unique_departments = set(df['Sending_Dept']).union(set(df['Accepting_Dept']))  
Depts = list(unique_departments)  
Dept_indices = {
   }  
for i, dept in enumerate(Depts):  
    Dept_indices[dept] = i  
sending_indices = []  
for dept in df['Sending_Dept']:  
    dept_index = Dept_indices[dept]  
    sending_indices.append(dept_index)  
    print(f"Sending indices are: {
     sending_indices}")  
accepting_indices = []  
for dept in df['Accepting_Dept']:  
    dept_index = Dept_indices[dept]  
    accepting_indices.append(dept_index)  
flowvalues = df['FlowValue'].tolist()  
# Sankey diagram  
fig = gr.Figure(data=[gr.Sankey(  
    node=dict( pad=10,thickness=25,line=dict(color="red", width=0.8),label=Depts,),  
    link=dict(source=sending_indices,target=accepting_indices,value=flowvalues  
    ))])  
fig.update_layout(title_text="Sankey Diagram of exchange students flow between University Depts", font_size=12)  
fig.show()  

生成的"桑基图"图(1)中,节点3A旁的橙色矩形显示了光标放置在节点上时的情况。当光标位于节点"3A"上时,我们可以看到A大学3系接受和派遣交换生的频率。它接受学生1次,派遣学生3次。我们还可以从上面代码片段中的 data 字典推断出这一点,因为"3A"在Sending_Dept列表中出现了3次,在Accepting_Dept列表中出现了1次。节点 “3A” 左边的数字9是它向B大学派出的交换生总数。我们还可以通过在Sending_Dept列表中添加与3A相对应的FlowValues来推断。

我们还注意到,当我们点击节点 “3A” 时,从它发出的箭头会变暗,并显示出与 “3A” 交换学生的其他节点。箭头的粗细与 FlowValues 相对应。总之,桑基图利用箭头的方向和粗细来传递流动信息,并以文字为基础为每个节点形成累积流动。

图 1. 桑基图显示了两所大学各系之间的学生交流流

用例 2

绘制一家房地产中介公司的房屋销售数据。

一位数据科学家在房地产中介公司工作,机构要求绘制上个月售出房屋信息的二维图。每栋售出的房屋需包含房价、距离市中心、方向、代理佣金和销售代理的公司级别(助理、副总裁、合伙人)的信息。二维图形信息量大,可使用复杂对象描述地块上的每栋房屋。具体来说,使用“笑脸表情符号”实现方法的代码片段如下。

import matplotlib.pyplot as plt  
import numpy as np  
np.random.seed(125)  
num_houses = 10  
distances = np.random.uniform(0, 30, num_houses)  # distance from city center  
prices = np.random.uniform(400, 2000, num_houses) * 1000  # sale price in thousands  
directions = np.random.choice(['N', 'S', 'E', 'W'], num_houses)  # direction from city center  
agent_levels = np.random.choice([1, 2, 3], num_houses)  # agent's level  
def get_emoji_size(level):  
    size_map = {
   1: 250, 2: 380, 3: 700}  
    return size_map.get(level, 120)  # Increased size for better visibility  
def get_emoji_color_new(price):  
    if price < 600000:  
        return 'white'  # Light yellow for $400k-$600k  
    elif price < 800000:  
        return 'yellow'        # White for $600k-$800k  
    elif price 
;