让数据集改变你的思维
数据可视化是数据科学家传达洞见和讲述数据故事的关键工具。作为 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 行创建了一个图表,其中 node
和 link
是字典。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