深度好文 |Matplotlib 可视化最有价值的 50 个图表(附完整 Python 源代码,推荐收藏)...

本文详细介绍了使用 Matplotlib 和 Seaborn 库绘制数据分析中常见的50种图表,包括散点图、气泡图、线性回归、条形图、直方图、面积图等多种类型。每种图表都有相应的 Python 代码示例,涵盖了关联、偏差、排序、分布、组成和变化等多个数据分析场景,是提升数据可视化能力的宝贵资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

价值前瞻

点击右侧关注,让你成为一个有远见的人!

Python数据之道

点击右侧关注,开启数据之道!

翻译 | Lemonbit

原文来源 | Machine Learning Plus

译文出品 | Python数据之道

这篇文章最早是由「Python数据之道」翻译的完整版,之后陆陆续续有不同的翻译版本。

内容很经典,值得再次分享给各位。

Matplotlib 可视化最有价值的 50 个图表

(附完整 Python 源代码)

本文总结了 Matplotlib 以及 Seaborn 用的最多的50个图形,掌握这些图形的绘制,对于数据分析的可视化有莫大的作用,强烈推荐大家阅读后续内容。

如果觉得内容不错,欢迎分享到您的朋友圈。

Tips: 

(1)本文原文部分代码有不准确的地方,已进行修改; 

(2)所有正确的源代码,我已整合到 jupyter notebook 文件中,可以在公众号『Python数据之道』后台回复 “code”,可获得本文源代码; 

(3)运行本文代码,除了安装 matplotlib 和 seaborn 可视化库外,还需要安装其他的一些辅助可视化库,已在代码部分作标注,具体内容请查看下面文章内容。

(4)由于微信文章总字数不能超过5万字,删除了部分代码,完整的文章请点击文章底部的阅读原文

在数据分析和可视化中最有用的 50 个 Matplotlib 图表。 这些图表列表允许您使用 python 的 matplotlib 和 seaborn 库选择要显示的可视化对象。

介绍

这些图表根据可视化目标的7个不同情景进行分组。 例如,如果要想象两个变量之间的关系,请查看“关联”部分下的图表。 或者,如果您想要显示值如何随时间变化,请查看“变化”部分,依此类推。

有效图表的重要特征:

  • 在不歪曲事实的情况下传达正确和必要的信息。

  • 设计简单,您不必太费力就能理解它。

  • 从审美角度支持信息而不是掩盖信息。

  • 信息没有超负荷。

准备工作

在代码运行前先引入下面的设置内容。 当然,单独的图表,可以重新设置显示要素。


   
   
   
  1. # !pip install brewer2mpl

  2. import numpy as np

  3. import pandas as pd

  4. import matplotlib as mpl

  5. import matplotlib.pyplot as plt

  6. import seaborn as sns

  7. import warnings; warnings.filterwarnings(action='once')

  8. large = 22; med = 16; small = 12

  9. params = { 'axes.titlesize': large,

  10.          'legend.fontsize': med,

  11.          'figure.figsize': (16, 10),

  12.          'axes.labelsize': med,

  13.          'axes.titlesize': med,

  14.          'xtick.labelsize': med,

  15.          'ytick.labelsize': med,

  16.          'figure.titlesize': large}

  17. plt.rcParams.update(params)

  18. plt.style.use('seaborn-whitegrid')

  19. sns.set_style("white")

  20. %matplotlib inline

  21. # Version

  22. print(mpl.__version__)  #> 3.0.0

  23. print(sns.__version__)  #> 0.9.0


   
   
   
  1. 3.0.2

  2. 0.9.0

一、关联 (Correlation)

关联图表用于可视化2个或更多变量之间的关系。 也就是说,一个变量如何相对于另一个变化。

1 散点图(Scatter plot)

散点图是用于研究两个变量之间关系的经典的和基本的图表。 如果数据中有多个组,则可能需要以不同颜色可视化每个组。 在 matplotlib 中,您可以使用 plt.scatterplot() 方便地执行此操作。


   
   
   
  1. # Import dataset

  2. midwest = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/midwest_filter.csv")

  3. # Prepare Data

  4. # Create as many colors as there are unique midwest['category']

  5. categories = np.unique(midwest['category'])

  6. colors = [plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]

  7. # Draw Plot for Each Category

  8. plt.figure(figsize=(16, 10), dpi= 80, facecolor='w', edgecolor='k')

  9. for i, category in enumerate(categories):

  10.    plt.scatter('area', 'poptotal',

  11.                data=midwest.loc[midwest.category==category, :],

  12.                s=20, cmap=colors[i], label=str(category))

  13.    # "c=" 修改为 "cmap=",Python数据之道 备注

  14. # Decorations

  15. plt.gca().set(xlim=(0.0, 0.1), ylim=(0, 90000),

  16.              xlabel='Area', ylabel='Population')

  17. plt.xticks(fontsize=12); plt.yticks(fontsize=12)

  18. plt.title("Scatterplot of Midwest Area vs Population", fontsize=22)

  19. plt.legend(fontsize=12)    

  20. plt.show()    

图1

2 带边界的气泡图(Bubble plot with Encircling)

有时,您希望在边界内显示一组点以强调其重要性。 在这个例子中,你从数据框中获取记录,并用下面代码中描述的 encircle() 来使边界显示出来。


   
   
   
  1. from matplotlib import patches

  2. from scipy.spatial importConvexHull

  3. import warnings; warnings.simplefilter('ignore')

  4. sns.set_style("white")

  5. # Step 1: Prepare Data

  6. midwest = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/midwest_filter.csv")

  7. # As many colors as there are unique midwest['category']

  8. categories = np.unique(midwest['category'])

  9. colors = [plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]

  10. # Step 2: Draw Scatterplot with unique color for each category

  11. fig = plt.figure(figsize=(16, 10), dpi= 80, facecolor='w', edgecolor='k')    

  12. for i, category in enumerate(categories):

  13.    plt.scatter('area', 'poptotal', data=midwest.loc[midwest.category==category, :],

  14.                s='dot_size', cmap=colors[i], label=str(category), edgecolors='black', linewidths=.5)

  15.    # "c=" 修改为 "cmap=",Python数据之道 备注

  16. # Step 3: Encircling

  17. # https://stackoverflow.com/questions/44575681/how-do-i-encircle-different-data-sets-in-scatter-plot

  18. def encircle(x,y, ax=None, **kw):

  19.    ifnot ax: ax=plt.gca()

  20.    p = np.c_[x,y]

  21.    hull = ConvexHull(p)

  22.    poly = plt.Polygon(p[hull.vertices,:], **kw)

  23.    ax.add_patch(poly)

  24. # Select data to be encircled

  25. midwest_encircle_data = midwest.loc[midwest.state=='IN', :]                        

  26. # Draw polygon surrounding vertices    

  27. encircle(midwest_encircle_data.area, midwest_encircle_data.poptotal, ec="k", fc="gold", alpha=0.1)

  28. encircle(midwest_encircle_data.area, midwest_encircle_data.poptotal, ec="firebrick", fc="none", linewidth=1.5)

  29. # Step 4: Decorations

  30. plt.gca().set(xlim=(0.0, 0.1), ylim=(0, 90000),

  31.              xlabel='Area', ylabel='Population')

  32. plt.xticks(fontsize=12); plt.yticks(fontsize=12)

  33. plt.title("Bubble Plot with Encircling", fontsize=22)

  34. plt.legend(fontsize=12)    

  35. plt.show()    

图2

3 带线性回归最佳拟合线的散点图 (Scatter plot with linear regression line of best fit)

如果你想了解两个变量如何相互改变,那么最佳拟合线就是常用的方法。 下图显示了数据中各组之间最佳拟合线的差异。 要禁用分组并仅为整个数据集绘制一条最佳拟合线,请从下面的 sns.lmplot()调用中删除 hue ='cyl'参数。


   
   
   
  1. # Import Data

  2. df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")

  3. df_select = df.loc[df.cyl.isin([4,8]), :]

  4. # Plot

  5. sns.set_style("white")

  6. gridobj = sns.lmplot(x="displ", y="hwy", hue="cyl", data=df_select,

  7.                     height=7, aspect=1.6, robust=True, palette='tab10',

  8.                     scatter_kws=dict(s=60, linewidths=.7, edgecolors='black'))

  9. # Decorations

  10. gridobj.set(xlim=(0.5, 7.5), ylim=(0, 50))

  11. plt.title("Scatterplot with line of best fit grouped by number of cylinders", fontsize=20)

  12. plt.show()

图3

针对每列绘制线性回归线

或者,可以在其每列中显示每个组的最佳拟合线。 可以通过在 sns.lmplot() 中设置 col=groupingcolumn 参数来实现,如下:


   
   
   
  1. # Import Data

  2. df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")

  3. df_select = df.loc[df.cyl.isin([4,8]), :]

  4. # Each line in its own column

  5. sns.set_style("white")

  6. gridobj = sns.lmplot(x="displ", y="hwy",

  7.                     data=df_select,

  8.                     height=7,

  9.                     robust=True,

  10.                     palette='Set1',

  11.                     col="cyl",

  12.                     scatter_kws=dict(s=60, linewidths=.7, edgecolors='black'))

  13. # Decorations

  14. gridobj.set(xlim=(0.5, 7.5), ylim=(0, 50))

  15. plt.show()

图3-2

4 抖动图 (Jittering with stripplot)

通常,多个数据点具有完全相同的 X 和 Y 值。 结果,多个点绘制会重叠并隐藏。 为避免这种情况,请将数据点稍微抖动,以便您可以直观地看到它们。 使用 seaborn 的 stripplot() 很方便实现这个功能。


   
   
   
  1. # Import Data

  2. df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")

  3. # Draw Stripplot

  4. fig, ax = plt.subplots(figsize=(16,10), dpi= 80)    

  5. sns.stripplot(df.cty, df.hwy, jitter=0.25, size=8, ax=ax, linewidth=.5)

  6. # Decorations

  7. plt.title('Use jittered plots to avoid overlapping of points', fontsize=22)

  8. plt.show()

图4

5 计数图 (Counts Plot)

避免点重叠问题的另一个选择是增加点的大小,这取决于该点中有多少点。 因此,点的大小越大,其周围的点的集中度越高。


   
   
   
  1. # Import Data

  2. df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")

  3. df_counts = df.groupby(['hwy', 'cty']).size().reset_index(name='counts')

  4. # Draw Stripplot

  5. fig, ax = plt.subplots(figsize=(16,10), dpi= 80)    

  6. sns.stripplot(df_counts.cty, df_counts.hwy, size=df_counts.counts*2, ax=ax)

  7. # Decorations

  8. plt.title('Counts Plot - Size of circle is bigger as more points overla

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值