找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4677

积分

0

好友

641

主题
发表于 5 小时前 | 查看: 3| 回复: 0

在数据分析中,收集数据只是第一步,更重要的是对其进行解释和分析,以挖掘数据中蕴含的模式、趋势或变量间的关系。数据可视化正是将信息提炼为知识、实现“观物至知”的关键工具,它能帮助决策者从复杂、多维的数据中快速获取有效信息。

14种数据可视化类型思维导图

研究表明,人眼具有超强的模式识别能力,对可视符号的处理速度远超数字或文本。在大数据时代,数据可视化是洞察数据内涵、理解数据价值的得力工具。可视化常被用来辅助决策。面对一张密密麻麻的数据表,我们可能难以快速得出结论,但通过合适的可视化图形,信息便一目了然。

数据可视化辅助决策示意图

本文将通过Python(使用Plotly和Seaborn库)详细介绍多种常见的可视化图表类型、适用场景,并提供对应的实现代码。

条形图

条形图用矩形条的高度或长度来表示分类数据的数值大小。条形可以是垂直的(柱形图)或水平的。它适合用于分类数据的对比。注意:条形图数据条数不宜超过12条(垂直)或30条(水平)。

下图展示了按年份显示的加拿大人口条形图:

加拿大人口条形图

Plotly 代码

import plotly.express as px
data_canada = px.data.gapminder().query("country == 'Canada'")
fig = px.bar(data_canada, x='year', y='pop')
fig.show()

Seaborn 代码

import seaborn as sns
sns.set_context({'figure.figsize':[14, 8]})
sns.set_theme(style="whitegrid")
ax = sns.barplot(x="year", y="pop", data=data_canada)

Seaborn绘制的加拿大人口条形图

调整Seaborn图表大小的方法

  1. 使用Seaborn自带的设置
sns.set_context({'figure.figsize':[20, 20]})
sns.boxplot(x)
  1. 结合Matplotlib
from matplotlib import pyplot as plt
import seaborn as sns
plt.figure(figsize=(20,20))    
# 或者 plt.rcParams['figure.figsize'] = (20.0, 20.0)
sns.distplot(launch.date)
plt.show()
  1. 针对displot和jointplot
ax = sns.boxplot(x)
ax.figure.set_size_inches(12,6)

条形图的常见类型

分组条形图

当数据具有子组时,使用分组条形图,子组通过不同颜色区分。

分组条形图示例

Plotly代码

import plotly.express as px
df = px.data.tips()
fig = px.bar(df, x="sex", y="total_bill",
             color='smoker', barmode='group',
             height=500)
fig.show()

Plotly分组条形图

Seaborn代码

import seaborn as sb
df = sb.load_dataset('tips')
df = df.groupby(['size', 'sex']).agg(mean_total_bill=("total_bill", 'mean'))
df = df.reset_index()
sb.barplot(x="size", y="mean_total_bill",
           hue="sex", data=df)

Seaborn分组条形图

堆积条形图

堆积条形图将每个柱子分割,以显示相同类别下各子组数据的大小。分为:

  • 堆积柱状图:比较同类别各变量和不同类别变量总和差异。
  • 百分比堆积柱状图:适合展示同类别的每个变量的比例。

Plotly代码

import plotly.express as px
df = px.data.tips()
fig = px.bar(df, x="sex", y="total_bill", color='time')
fig.show()

Plotly堆积条形图

Seaborn代码

import pandas
import matplotlib.pylab as plt
import seaborn as sns
plt.rcParams["figure.figsize"] = [12, 6]
plt.rcParams["figure.autolayout"] = True
df = pandas.DataFrame(dict(
   number=[2, 5, 1, 6, 3],
   count=[56, 21, 34, 36, 12],
   select=[29, 13, 17, 21, 8]
))
bar_plot1 = sns.barplot(x='number', y='count', 
                        data=df, label="count",
                        color="red")
bar_plot2 = sns.barplot(x='number', y='select', 
                        data=df, label="select",
                        color="green")
plt.legend(ncol=2, loc="upper right",
           frameon=True, fontsize=15)
plt.xlabel('number', fontsize=15)
plt.ylabel('select',fontsize=15)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.show()

Seaborn堆积条形图

分段条形图是堆积条形图的一种特殊形式,每个堆叠条形显示其离散值占总值的百分比,总和为100%。

线形图

线形图将一系列数据点用线段连接起来,用于可视化数据随时间或其他连续变量的趋势。

下图展示了加拿大预期寿命随年份变化的线形图:

加拿大预期寿命线形图

Plotly代码

import plotly.express as px
df = px.data.gapminder().query("country=='Canada'")
fig = px.line(df, x="year", y="lifeExp",
              title='Life expectancy in Canada')
fig.show()

Seaborn代码

import seaborn as sns
sns.lineplot(data=df,
             x="year",
             y="lifeExp")

Seaborn线形图

线形图的类型

多线图

多线图包含多条线,代表数据集中的多个变量,可用于研究同一时期多个变量的变化。

Plotly代码

import plotly.express as px
df = px.data.gapminder().query("continent == 'Oceania'")
fig = px.line(df, x='year', y='lifeExp', color='country')
fig.show()

多线图示例

Seaborn代码

import seaborn as sns
sns.lineplot(data=df, x='year',
     y='lifeExp', hue='country')

Seaborn多线图

复合折线图(堆叠面积图)

复合折线图是简单线图的扩展,每一条线向下阴影到x轴,形成堆叠效果,即堆叠面积图。它显示每个数值所占大小随时间变化的趋势,展示部分与整体的关系。

适用:对比多变量随时间变化的情况,不适用于带负值的数据集。
分类

  • 堆积面积图:比较同类别各变量和不同类别变量总和差异。
  • 百分比堆积面积图:比较同类别的各个变量的比例差异。

复合折线图/堆叠面积图示例

饼形图

饼图是圆形统计图,通过切片来展示数值比例,每个切片的弧长、中心角、面积都与其代表的数量成正比。它用于表示不同分类的占比情况。

适用:比较一个数据分类上各个模块的大小占比。
注意事项:不适用于多分类数据,一张饼图不宜多于9个分类,否则切片过小,区分度下降,不利于对比。

Plotly 代码

import plotly.express as px
df = px.data.gapminder().query("year == 2007").query("continent == 'Europe'")
df.loc[df['pop'] < 2.e6, 'country'] = 'Other countries' # 仅展示人口大国
fig = px.pie(df, values='pop', names='country',
             title='Population of European continent')
fig.show()

欧洲人口饼图

Seaborn/Matplotlib 代码

Seaborn没有默认的饼图函数,但可结合Matplotlib和Seaborn调色板。

import matplotlib.pyplot as plt
import seaborn as sns

data = [15, 25, 25, 30, 5]
labels = ['Group 1', 'Group 2', 'Group 3', 'Group 4', 'Group 5']

colors = sns.color_palette('pastel')[0:5]

plt.pie(data, labels = labels, colors = colors, autopct='%.0f%%')
plt.show()

Seaborn调色板绘制的饼图

饼图的常见类型

爆炸饼图

图表的一个或多个扇区与主体分离,用于强调特定数据元素。

Plotly代码

import plotly.graph_objects as go

labels = ['Oxygen','Hydrogen',
          'Carbon_Dioxide','Nitrogen']
values = [4500, 2500, 1053, 500]

# pull属性控制扇形分离半径
fig = go.Figure(data=[go.Pie(labels=labels, 
                             values=values, pull=[0, 0, 0.2, 0])])
fig.show()

爆炸饼图

Matplotlib代码

import matplotlib.pyplot as plt
import seaborn as sns

data = [15, 25, 25, 30, 5]
labels = ['Group 1', 'Group 2', 'Group 3', 'Group 4', 'Group 5']

colors = sns.color_palette('pastel')[0:5]

plt.pie(data, labels = labels, 
        colors = colors, 
        autopct='%.0f%%', 
        explode = [0, 0, 0, 0.2, 0])
plt.show()

Matplotlib爆炸饼图

甜甜圈图(环图)

中心有空洞的饼图,空间利用率更高,空心区域可用于显示文本或标题。

Plotly代码

import plotly.graph_objects as go

labels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']
values = [4500, 2500, 1053, 500]

# 使用‘hole’创建甜甜圈图
fig = go.Figure(data=[go.Pie(labels=labels, values=values, hole=.3)])
fig.show()

甜甜圈图

Matplotlib代码

import numpy as np
import matplotlib.pyplot as plt
data = np.random.randint(20, 100, 6)
plt.pie(data,
         autopct='%3.1f%%',
         radius=1,
         pctdistance=0.85,
         startangle=90,
         counterclock=False,
         # 楔形块边界属性字典
         wedgeprops={'edgecolor': 'white',
                     'linewidth': 1,
                     'linestyle': '-'
                     },
         # 楔形块标签文本和数据标注文本的字体属性
         textprops=dict(color='k',  # 字体颜色
                        fontsize=14,
                        family='Arial'               
                        ))
circle = plt.Circle( (0,0), 0.7, color='white')
p=plt.gcf()
p.gca().add_artist(circle)
plt.show()

Matplotlib环形图

字母符合饼图

用于详细展示现有饼图中某一部分的构成,可减少主图混乱并强调特定元素。代码较长,涉及子图与连线,此处展示其效果图:

字母符合饼图

3D饼图

在三维空间中表示的饼图,在Matplotlib中可通过设置shadow=True实现立体效果。

3D饼图示例

import matplotlib.pyplot as plt
labels = ['Python', 'C++', 'Ruby', 'Java']
sizes = [215, 130, 245, 210]
# 绘图
plt.pie(sizes, labels=labels, 
        autopct='%1.1f%%', shadow=True, startangle=140)
plt.axis('equal')
plt.show()

编程语言占比3D饼图

直方图

直方图是数值数据分布的近似表示,由一系列高度不等的纵向条纹显示数据分布。数据被划分为多个不重叠的区间(箱),矩形高度与该箱内数据点数量成正比。

适用:利于展示大量数据集的统计结果,展示数据分布密度。

账单金额直方图

Plotly 代码

import plotly.express as px
df = px.data.tips()
fig = px.histogram(df, x="total_bill")
fig.show()

Seaborn 代码

import seaborn as sns
sns.set_context({'figure.figsize':[12, 8]})
penguins = sns.load_dataset("penguins")
ax = sns.histplot(data=penguins, x="flipper_length_mm")
ax.xaxis.label.set_size(15)
ax.yaxis.label.set_size(15)

企鹅鳍长直方图

直方图的分布类型

  • 正态分布:通常呈钟形。
  • 双峰分布:由两个组合变量的正态分布叠加而成。
    双峰分布直方图

Plotly双峰分布代码

import plotly.express as px
df = px.data.tips()
fig = px.histogram(df, x="total_bill", y="tip", 
                   color="sex", marginal="rug",
                   hover_data=df.columns)
fig.show()
  • 核密度估计图:展示数据平滑的分布密度。
import seaborn as sns
iris = sns.load_dataset("iris")
sns.kdeplot(data=iris)

鸢尾花特征核密度图

  • 偏态分布:峰值偏向图形一端的不对称分布。
  • 随机分布(多峰分布):无规则模式,产生多个峰。
  • 边缘峰值分布:类似正态分布,但一端有一个大峰。
  • 梳状分布:矩形条高度高低交替,形如梳子。

面积图

面积图用线与轴之间的彩色区域表示,区域面积与数值成正比。

类型

  • 简单面积图:彩色区域彼此重叠。
  • 堆积面积图:彩色区域彼此堆叠,不相交。
  • 100%堆积面积图:纵轴总计100%,显示每组数据占总量的百分比。

3-D 面积图(堆叠面积图)

在二维平面上展示的堆叠面积图,常用于显示多组数据随时间的变化及总和。

各洲人口堆叠面积图

Plotly代码

import plotly.express as px
df = px.data.gapminder()
fig = px.area(df, x="year", y="pop", color="continent",
       line_group="country")
fig.show()

Matplotlib/Seaborn代码

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_context({'figure.figsize':[15, 8]})
sns.set_theme()

df = pd.DataFrame({'period': [1, 2, 3, 4, 5, 6, 7, 8],
                   'team_A': [20, 12, 15, 14, 19, 23, 25, 29],
                   'team_B': [5, 7, 7, 9, 12, 9, 9, 4],
                   'team_C': [11, 8, 10, 6, 6, 5, 9, 12]})

plt.stackplot(df.period, df.team_A, df.team_B, df.team_C)

团队数据堆叠面积图

点阵图

点阵图将数据点绘制在图形上。类型包括:

  • 威尔金森点图:使用局部位移防止点重叠。
  • 克利夫兰点图:类似散点图,但在一个维度上垂直显示数据。

奖牌数量点阵图

Plotly代码

import plotly.express as px
df = px.data.medals_long()

fig = px.scatter(df, y="nation", x="count",
                 color="medal", symbol="medal")
fig.update_traces(marker_size=10)
fig.show()

Seaborn代码

import seaborn as sns
sns.set_context({'figure.figsize':[15, 8]})
sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.stripplot(x="day",
                   y="total_bill", data=tips)

每日账单点阵图

散点图

散点图使用笛卡尔坐标显示两个连续变量的值,通过点的分布推断变量间的相关性。

适用:相关性分析,如回归分析。

萼片尺寸散点图

Plotly 代码

import plotly.express as px
df = px.data.iris() # iris is a pandas DataFrame
fig = px.scatter(df, x="sepal_width", y="sepal_length")
fig.show()

Seaborn 代码

import seaborn as sns
tips = sns.load_dataset("tips")
sns.scatterplot(data=tips, x="total_bill", y="tip")

账单与小费散点图

散点图的相关性类型

  • 正相关:一个变量增加,另一个也增加。
  • 负相关:一个变量增加,另一个减少。
  • 无相关性:两组数据间无明显关系。

气泡图

气泡图是散点图的变体,可展示三个属性:x位置、y位置和气泡大小(代表第三个变量)。

适用:分类数据对比,多变量相关性分析。
注意事项:气泡过多会降低可读性,气泡大小应映射到面积而非半径绘制,以避免视觉误差。

各国人口气泡图

Plotly 代码

import plotly.express as px
df = px.data.gapminder()

fig = px.scatter(df.query("year==2007"), x="gdpPercap", y="lifeExp",
         size="pop", color="continent",
                 hover_name="country", log_x=True, size_max=60)
fig.show()

Seaborn 代码

import matplotlib.pyplot as plt
import seaborn as sns
from gapminder import gapminder # import data set 
data = gapminder.loc[gapminder.year == 2007]

b = sns.scatterplot(data=data, x="gdpPercap", 
                    y="lifeExp", size="pop", 
                    legend=False, sizes=(20, 2000))

b.set(xscale="log")
plt.show()

Seaborn气泡图

气泡图的其他类型

  • 带标签的气泡图
  • 多变量气泡图(四个变量,第四维用颜色区分)
  • 地图气泡图
  • 3D气泡图

雷达图

雷达图是展示多个定量变量的二维图表,变量显示在从同一点开始的轴线上。

材料性能雷达图

Plotly 代码

import plotly.express as px
import pandas as pd
df = pd.DataFrame(dict(
    r=[1, 5, 2, 2, 3],
    theta=['processing cost','mechanical properties',
           'chemical stability',
           'thermal stability', 'device integration']))
fig = px.line_polar(df, r='r', theta='theta', line_close=True)
fig.show()

Matplotlib 代码

import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
stats=np.array([1, 5, 2, 2, 3])
labels=['processing cost','mechanical properties','chemical stability',
           'thermal stability', 'device integration']
angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False)
fig=plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, stats, 'o-', linewidth=2)
ax.fill(angles, stats, alpha=0.25)
ax.set_thetagrids(angles * 180/np.pi, labels)
ax.set_title("Radar Chart")
ax.grid(True)

Matplotlib雷达图

类型

  • 简单的雷达图
  • 带标记的雷达图
  • 填充雷达图

象形图

象形图使用图标来代表数据,使数据呈现更直观。每个图标代表一个单位或多个单位(如一百万)。

用户动态象形图

Plotly 代码(使用符号标记)

import plotly.graph_objs as go
from plotly.offline import iplot, init_notebook_mode
init_notebook_mode()
from IPython.display import display,HTML
import pandas as pd 

title = 'Team scores'

ds = pd.Series({'Alpha' : 67, 'Bravo' : 30, 'Charlie' : 20, 'Delta': 12, 'Echo': 23, 'Foxtrot': 56})

print(sum(ds))

Xlim = 16
Ylim = 13
Xpos = 0
Ypos = 12 ##change to zero for upwards
series = []
for name, count in ds.iteritems():
    x = []
    y = []
    for j in range(0, count):
        if Xpos == Xlim:
            Xpos = 0
            Ypos -= 1 ##change to positive for upwards
        x.append(Xpos)
        y.append(Ypos)
        Xpos += 1
    series.append(go.Scatter(x=x, y=y, mode='markers', marker={'symbol': 'square', 'size': 15}, name=f'{name} ({count})'))

fig = go.Figure(dict(data=series, layout=go.Layout(
    title={'text': title, 'x': 0.5, 'xanchor': 'center'},
    paper_bgcolor='rgba(255,255,255,1)',
    plot_bgcolor='rgba(0,0,0,0)',
    xaxis=dict(showgrid=False,zeroline= False, showline=False, visible=False, showticklabels=False),
    yaxis=dict(showgrid=False,zeroline= False, showline=False, visible=False, showticklabels=False),
)))
fig.show()

团队得分象形图

样条图

样条图是折线图的一种,它用平滑的拟合曲线连接数据点,可用于粗略近似缺失的数据点。

样条图示例

Plotly 代码

在Plotly中,通过指定line_shape='spline'实现。

import plotly.express as px
df = px.data.gapminder().query("country=='Canada'")
fig = px.line(df, x="year", y="lifeExp", 
              title='Life expectancy in Canada', 
              line_shape = 'spline')
fig.show()

使用Scipy插值实现

from scipy import interpolate
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1,2,figsize=(15,7))
x = np.array([1, 2, 3, 4])
y = np.array([75, 0, 25, 100])
ax[0].plot(x, y)

x_new = np.linspace(1, 4, 300)
a_BSpline = interpolate.make_interp_spline(x, y)
y_new = a_BSpline(x_new)

ax[1].plot(x_new, y_new)

普通折线与样条曲线对比

箱形图

箱形图(盒须图)利用最小值、第一四分位数(Q1)、中位数、第三四分位数(Q3)和最大值来显示一组数据的分布情况。箱体两端是Q1和Q3,箱内线为中位数。须线通常延伸到Q1 - 1.5 * IQRQ3 + 1.5 * IQR范围内的最远数据点,此范围外的点被视为异常值。

适用:展示数据分散情况,特别用于多个样本的比较。

Plotly 代码

import numpy as np 
import plotly.express as px
data = np.array([-40,1,2,5,10,13,15,16,17,40])
fig = px.box(data, points="all")
fig.show()

箱形图

Seaborn 代码

import seaborn as sns
sns.set_style( 'darkgrid' )
fig = sns.boxplot(y=data)

Seaborn箱形图

小提琴图

小提琴图可视为箱形图与核密度图的结合体,它既显示了数据的四分位范围和中位数(箱形图信息),又通过宽度展示了数据的分布密度。

账单金额小提琴图

Plotly 代码

import plotly.express as px
df = px.data.tips()
fig = px.violin(df, y="total_bill", x="day", 
                color="sex", box=True, points="all",
          hover_data=df.columns)
fig.show()

Seaborn 代码

import seaborn as sns
sns.set_context({'figure.figsize':[15, 8]})
sns.set_theme(style="whitegrid")
tips = sns.load_dataset("tips")
ax = sns.violinplot(x="day", y="total_bill", hue="sex", data=tips)

按性别和日期分组的小提琴图

对比图(直方图、箱形图、小提琴图)

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
N = 10**4
x = np.random.normal(size=N)
fig, ax = plt.subplots(3, 1,figsize=(15,8), sharex=True)
sns.distplot(x, ax=ax[0])
ax[0].set_title('Histogram + KDE')
sns.boxplot(x, ax=ax[1])
ax[1].set_title('Boxplot')
sns.violinplot(x, ax=ax[2])
ax[2].set_title('Violin plot')
fig.suptitle('Standard Normal Distribution', fontsize=16)
plt.show()

三种分布图对比

总结与速查表

下表汇总了在Plotly和Seaborn中生成上述图表的主要方法和属性:

图表类型 Plotly Seaborn
简单条形图 express.bar barplot
分组条形图 color属性 + barmode='group' hue属性
堆积条形图 color属性 使用多个图的labelcolor属性
简单线图 express.line lineplot
多线图 colorsymbol属性 hue属性
简单饼图 express.pie matplotlib.pyplot.pie
爆炸饼图 graph_objects.Pie + pull属性 explode属性
甜甜圈图 graph_objects.Pie + hole属性 添加matplotlib.pyplot.Circle
3D饼图 使用pygooglechart shadow属性
直方图 express.histogram histplot
双峰直方图 color属性 kdeplot
面积图 express.area matplotlib.pyplot.stackplot
点阵图 express.scatter stripplot
散点图 express.scatter scatterplot
气泡图 express.scatter + colorsize属性 scatterplot + size属性
雷达图 express.line_polar matplotlib.pyplot绘图
象形图 graph_objects.Figure + Scatter + marker属性 matplotlib.pyplot + pywaffle
样条图 express.line + line_shape='spline' Scipy.interpolate.make_interp_spline
箱形图 express.box boxplot
小提琴图 express.violin violinplot

写在最后

我们系统性地梳理了多种数据可视化图表,了解了它们的适用场景,并掌握了使用强大的Python库(Plotly和Seaborn)生成这些图表的代码。在数据科学工作中,选择合适的图表并熟练地创建它们,是清晰传达数据见解、有效支撑决策的关键技能。

希望这份结合了概念、场景与实战代码的指南,能成为你在数据可视化探索路上的实用工具。




上一篇:Python数据可视化:6个Matplotlib风格库提升图表颜值与专业度
下一篇:cuDF对比Pandas:GPU加速的数据处理替代方案与性能实测
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-9 08:21 , Processed in 0.655461 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表