大家好,我是小寒。
今天给大家分享 18 个必会的数据可视化技术。
首先,我们使用如下代码生成一个示例数据集。
import pandas as pd
import numpy as np
# Generate sample data
np.random.seed(0)
dates = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
products = ['Product A', 'Product B', 'Product C']
sales = pd.DataFrame({
'Date': np.random.choice(dates, 300),
'Product': np.random.choice(products, 300),
'Sales': np.random.randint(100, 1000, size=300)
})
1.折线图
折线图适合可视化随时间变化的趋势。
import matplotlib.pyplot as plt
# Data preprocessing
sales_by_date = sales.groupby('Date')['Sales'].sum()
# Visualization
plt.figure(figsize=(10, 6))
plt.plot(sales_by_date.index, sales_by_date.values, marker='o', linestyle='-')
plt.title('Sales Trend Over Time')
plt.xlabel('Date')
plt.ylabel('Sales')
plt.grid(True)
plt.show()
图片
2.条形图
条形图非常适合比较分类数据。
sales_by_product = sales.groupby('Product')['Sales'].sum()
# Visualization
plt.figure(figsize=(10, 6))
sales_by_product.plot(kind='bar', color='skyblue')
plt.title('Total Sales by Product')
plt.xlabel('Product')
plt.ylabel('Sales')
plt.xticks(rotatinotallow=45)
plt.grid(axis='y')
plt.show()
图片
3.散点图
散点图对于可视化两个变量之间的关系非常有效。
import seaborn as sns
# Data preprocessing
sales_by_product = sales.groupby('Product')['Sales'].sum().reset_index()
# Visualization
plt.figure(figsize=(10, 6))
sns.scatterplot(data=sales, x='Date', y='Sales', hue='Product')
plt.title('Sales Scatter Plot Over Time')
plt.xlabel('Date')
plt.ylabel('Sales')
plt.legend(title='Product')
plt.grid(True)
plt.show()
4.饼图
饼图对于显示整体的比例很有用。
# Data preprocessing
sales_by_product = sales.groupby('Product')['Sales'].sum()
# Visualization
plt.figure(figsize=(8, 8))
plt.pie(sales_by_product, labels=sales_by_product.index, autopct='%1.1f%%', startangle=140)
plt.title('Sales Distribution by Product')
plt.axis('equal')
plt.show()
5.直方图
直方图有助于理解数值数据的分布。
# Data preprocessing
sales_per_day = sales.groupby('Date')['Sales'].sum()
# Visualization
plt.figure(figsize=(10, 6))
plt.hist(sales_per_day, bins=20, color='lightblue', edgecolor='black')
plt.title('Distribution of Daily Sales')
plt.xlabel('Sales')
plt.ylabel('Frequency')
plt.grid(True)
plt.show()
图片
6.箱线图
箱线图对于显示数据分布和识别异常值非常有用。
# Visualization
plt.figure(figsize=(10, 6))
sns.boxplot(data=sales, x='Product', y='Sales')
plt.title('Sales Distribution by Product')
plt.xlabel('Product')
plt.ylabel('Sales')
plt.grid(True)
plt.show()
7.热图
热图可以揭示密集数据集中的模式和相关性。
# Data preprocessing
sales_pivot = sales.pivot_table(index='Date', columns='Product', values='Sales', aggfunc='sum')
# Visualization
plt.figure(figsize=(10, 8))
sns.heatmap(sales_pivot, cmap='Blues')
plt.title('Sales Heatmap by Date and Product')
plt.xlabel('Product')
plt.ylabel('Date')
plt.show()
8.气泡图
气泡图与散点图类似,但使用不同的气泡大小来表示附加维度。气泡图添加了一个视觉维度,可以根据销售量和比例来比较产品。
# Data preprocessing
sales_by_product = sales.groupby('Product')['Sales'].sum()
product_sizes = sales_by_product / sales_by_product.max() * 100 # Scale for bubble sizes
# Visualization
plt.figure(figsize=(10, 6))
plt.scatter(sales_by_product.index, sales_by_product.values, s=product_sizes, alpha=0.5)
plt.title('Sales by Product (Bubble Chart)')
plt.xlabel('Product')
plt.ylabel('Sales')
plt.grid(True)
plt.show()
9.树状图
树状图非常适合使用嵌套矩形显示分层数据。
import squarify
# Data preprocessing
sales_by_product = sales.groupby('Product')['Sales'].sum()
# Visualization
plt.figure(figsize=(10, 8))
squarify.plot(sizes=sales_by_product, label=sales_by_product.index, alpha=0.8)
plt.title('Sales Distribution by Product (Treemap)')
plt.axis('off')
plt.show()
图片
10.桑基图
桑基图显示节点之间的数据或资源流。
from matplotlib.sankey import Sankey
# Data preprocessing
product_sales = sales.groupby('Product')['Sales'].sum()
product_sales_diff = product_sales.diff().fillna(0)
# Visualization
plt.figure(figsize=(10, 8))
sankey = Sankey(flows=product_sales_diff.values, labels=product_sales_diff.index)
sankey.finish()
plt.title('Sales Flow Between Products (Sankey Diagram)')
plt.show()
11.小提琴图
小提琴图结合了箱线图和核密度图的特征,可以更丰富地理解数据的分布。
plt.figure(figsize=(10, 6))
sns.violinplot(data=sales, x='Product', y='Sales')
plt.title('Sales Distribution by Product (Violin Plot)')
plt.xlabel('Product')
plt.ylabel('Sales')
plt.grid(True)
plt.show()
12.雷达图
雷达图可用于比较不同类别的多个定量变量。
sales_by_product = sales.groupby('Product')['Sales'].sum()
max_sales = sales_by_product.max()
# Visualization
labels=np.array(sales_by_product.index)
stats=sales_by_product.values
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False).tolist()
fig, ax = plt.subplots(figsize=(10, 6), subplot_kw=dict(polar=True))
ax.fill(angles, stats, color='skyblue', alpha=0.25)
ax.plot(angles, stats, color='blue', linewidth=2)
ax.set_yticklabels([])
plt.title('Sales Comparison by Product (Radar Chart)')
ax.set_xticks(angles)
ax.set_xticklabels(labels)
plt.show()
图片
13.词云
词云是一种视觉上吸引人的方式来表示文本数据,其中每个单词的大小表示其频率。
from wordcloud import WordCloud
# Data preprocessing (assuming there is a text column in the sales dataset)
text_data = ' '.join(sales['Product'])
# Visualization
wordcloud = WordCloud(width=800, height=400, background_color='white').generate(text_data)
plt.figure(figsize=(10, 6))
plt.imshow(wordcloud, interpolatinotallow='bilinear')
plt.title('Word Cloud of Products')
plt.axis('off')
plt.show()
14.平行坐标图
平行坐标图对于可视化多变量数据非常有用,特别是对于比较不同类别的变量时。
from pandas.plotting import parallel_coordinates
# Assuming there are multiple numerical columns in the sales dataset
# and 'Product' is a categorical variable
plt.figure(figsize=(10, 6))
parallel_coordinates(sales, 'Product', colormap='viridis')
plt.title('Parallel Coordinates Plot of Sales Variables by Product')
plt.xlabel('Variables')
plt.ylabel('Values')
plt.xticks(rotatinotallow=45)
plt.show()
15.六边形图
六边形图可用于通过将数据分箱到六边形箱中来可视化大型数据集的分布。
plt.figure(figsize=(10, 6))
plt.hexbin(range(len(sales)), sales['Sales'], gridsize=20, cmap='Blues')
plt.colorbar(label='count in bin')
plt.title('Hexbin Plot of Sales Over Time')
plt.xlabel('Time')
plt.ylabel('Sales')
plt.show()
16.极坐标图
极坐标图对于可视化循环数据非常有用,例如周期性趋势或方向数据。
plt.figure(figsize=(10, 8))
plt.subplot(111, polar=True)
theta = np.linspace(0, 2*np.pi, len(sales))
r = sales['Sales']
plt.plot(theta, r)
plt.title('Polar Plot of Sales Over Time')
plt.show()
17.KDE 图
KDE 图估计连续变量的概率密度函数,提供对数据基本分布的洞察。
plt.figure(figsize=(10, 6))
sns.kdeplot(data=sales, x='Sales', shade=True, color='skyblue')
plt.title('Kernel Density Estimation (KDE) Plot of Sales')
plt.xlabel('Sales')
plt.ylabel('Density')
plt.grid(True)
plt.show()
18. 配对图
配对图可视化数据集中多个变量之间的成对关系。
plt.figure(figsize=(10, 8))
sns.pairplot(sales)
plt.suptitle('Pairwise Relationships Between Variables')
plt.show()