50个数据可视化最有价值的图表(附完整Python代码,建议收藏)

论坛 期权论坛 期权     
大数据   2019-6-16 04:35   7008   0

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

作者:Lemonbit
来源:Python数据之道(ID:PyDataRoad)

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

  • [h1]介绍[/h1]

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

有效图表的重要特征:

  • 在不歪曲事实的情况下传达正确和必要的信息。
  • 设计简单,您不必太费力就能理解它。
  • 从审美角度支持信息而不是掩盖信息。
  • 信息没有超负荷。


  • [h1]准备工作[/h1]

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

    1. # !pip install brewer2mpl
    复制代码
    1. import numpy as np
    复制代码
    1. import pandas as pd
    复制代码
    1. import matplotlib as mpl
    复制代码
    1. import matplotlib.pyplot as plt
    复制代码
    1. import seaborn as sns
    复制代码
    1. import warnings; warnings.filterwarnings(action='once')
    复制代码


    1. large = 22; med = 16; small = 12
    复制代码
    1. params = {'axes.titlesize': large,
    复制代码
    1.           'legend.fontsize': med,
    复制代码
    1.           'figure.figsize': (16, 10),
    复制代码
    1.           'axes.labelsize': med,
    复制代码
    1.           'axes.titlesize': med,
    复制代码
    1.           'xtick.labelsize': med,
    复制代码
    1.           'ytick.labelsize': med,
    复制代码
    1.           'figure.titlesize': large}
    复制代码
    1. plt.rcParams.update(params)
    复制代码
    1. plt.style.use('seaborn-whitegrid')
    复制代码
    1. sns.set_style("white")
    复制代码
    1. %matplotlib inline
    复制代码


    1. # Version
    复制代码
    1. print(mpl.__version__)  #> 3.0.0
    复制代码
    1. print(sns.__version__)  #> 0.9.0
    复制代码
    1. 3.0.2
    复制代码
    1. 0.9.0
    复制代码

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

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

    1. midwest = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/midwest_filter.csv")
    复制代码


    1. # Prepare Data
    复制代码
    1. # Create as many colors as there are unique midwest['category']
    复制代码
    1. categories = np.unique(midwest['category'])
    复制代码
    1. colors = [plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]
    复制代码


    1. # Draw Plot for Each Category
    复制代码
    1. plt.figure(figsize=(16, 10), dpi= 80, facecolor='w', edgecolor='k')
    复制代码


    1. for i, category in enumerate(categories):
    复制代码
    1.     plt.scatter('area', 'poptotal',
    复制代码
    1.                 data=midwest.loc[midwest.category==category, :],
    复制代码
    1.                 s=20, cmap=colors[i], label=str(category))
    复制代码
    1.     # "c=" 修改为 "cmap=",Python数据之道 备注
    复制代码


    1. # Decorations
    复制代码
    1. plt.gca().set(xlim=(0.0, 0.1), ylim=(0, 90000),
    复制代码
    1.               xlabel='Area', ylabel='Population')
    复制代码


    1. plt.xticks(fontsize=12); plt.yticks(fontsize=12)
    复制代码
    1. plt.title("Scatterplot of Midwest Area vs Population", fontsize=22)
    复制代码
    1. plt.legend(fontsize=12)   
    复制代码
    1. plt.show()   
    复制代码




▲图1

[h2]2. 带边界的气泡图(Bubble plot with Encircling)[/h2]
有时,您希望在边界内显示一组点以强调其重要性。在这个例子中,你从数据框中获取记录,并用下面代码中描述的 encircle() 来使边界显示出来。

    1. from matplotlib import patches
    复制代码
    1. from scipy.spatial import ConvexHull
    复制代码
    1. import warnings; warnings.simplefilter('ignore')
    复制代码
    1. sns.set_style("white")
    复制代码


    1. # Step 1: Prepare Data
    复制代码
    1. midwest = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/midwest_filter.csv")
    复制代码


    1. # As many colors as there are unique midwest['category']
    复制代码
    1. categories = np.unique(midwest['category'])
    复制代码
    1. colors = [plt.cm.tab10(i/float(len(categories)-1)) for i in range(len(categories))]
    复制代码


    1. # Step 2: Draw Scatterplot with unique color for each category
    复制代码
    1. fig = plt.figure(figsize=(16, 10), dpi= 80, facecolor='w', edgecolor='k')   
    复制代码


    1. for i, category in enumerate(categories):
    复制代码
    1.     plt.scatter('area', 'poptotal', data=midwest.loc[midwest.category==category, :],
    复制代码
    1.                 s='dot_size', cmap=colors[i], label=str(category), edgecolors='black', linewidths=.5)
    复制代码
    1.     # "c=" 修改为 "cmap=",Python数据之道 备注
    复制代码


    1. # Step 3: Encircling
    复制代码
    1. # https://stackoverflow.com/questions/44575681/how-do-i-encircle-different-data-sets-in-scatter-plot
    复制代码
    1. def encircle(x,y, ax=None, **kw):
    复制代码
    1.     if not ax: ax=plt.gca()
    复制代码
    1.     p = np.c_[x,y]
    复制代码
    1.     hull = ConvexHull(p)
    复制代码
    1.     poly = plt.Polygon(p[hull.vertices,:], **kw)
    复制代码
    1.     ax.add_patch(poly)
    复制代码


    1. # Select data to be encircled
    复制代码
    1. midwest_encircle_data = midwest.loc[midwest.state=='IN', :]                        
    复制代码


    1. # Draw polygon surrounding vertices   
    复制代码
    1. encircle(midwest_encircle_data.area, midwest_encircle_data.poptotal, ec="k", fc="gold", alpha=0.1)
    复制代码
    1. encircle(midwest_encircle_data.area, midwest_encircle_data.poptotal, ec="firebrick", fc="none", linewidth=1.5)
    复制代码


    1. # Step 4: Decorations
    复制代码
    1. plt.gca().set(xlim=(0.0, 0.1), ylim=(0, 90000),
    复制代码
    1.               xlabel='Area', ylabel='Population')
    复制代码


    1. plt.xticks(fontsize=12); plt.yticks(fontsize=12)
    复制代码
    1. plt.title("Bubble Plot with Encircling", fontsize=22)
    复制代码
    1. plt.legend(fontsize=12)   
    复制代码
    1. plt.show()   
    复制代码





▲图2

[h2]3. 带线性回归最佳拟合线的散点图 (Scatter plot with linear regression line of best fit)[/h2]
如果你想了解两个变量如何相互改变,那么最佳拟合线就是常用的方法。下图显示了数据中各组之间最佳拟合线的差异。要禁用分组并仅为整个数据集绘制一条最佳拟合线,请从下面的 sns.lmplot()调用中删除 hue ='cyl'参数。

    1. # Import Data
    复制代码
    1. df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")
    复制代码
    1. df_select = df.loc[df.cyl.isin([4,8]), :]
    复制代码


    1. # Plot
    复制代码
    1. sns.set_style("white")
    复制代码
    1. gridobj = sns.lmplot(x="displ", y="hwy", hue="cyl", data=df_select,
    复制代码
    1.                      height=7, aspect=1.6, robust=True, palette='tab10',
    复制代码
    1.                      scatter_kws=dict(s=60, linewidths=.7, edgecolors='black'))
    复制代码


    1. # Decorations
    复制代码
    1. gridobj.set(xlim=(0.5, 7.5), ylim=(0, 50))
    复制代码
    1. plt.title("Scatterplot with line of best fit grouped by number of cylinders", fontsize=20)
    复制代码
    1. plt.show()
    复制代码




▲图3

  • 针对每列绘制线性回归线

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

    1. # Import Data
    复制代码
    1. df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")
    复制代码
    1. df_select = df.loc[df.cyl.isin([4,8]), :]
    复制代码


    1. # Each line in its own column
    复制代码
    1. sns.set_style("white")
    复制代码
    1. gridobj = sns.lmplot(x="displ", y="hwy",
    复制代码
    1.                      data=df_select,
    复制代码
    1.                      height=7,
    复制代码
    1.                      robust=True,
    复制代码
    1.                      palette='Set1',
    复制代码
    1.                      col="cyl",
    复制代码
    1.                      scatter_kws=dict(s=60, linewidths=.7, edgecolors='black'))
    复制代码


    1. # Decorations
    复制代码
    1. gridobj.set(xlim=(0.5, 7.5), ylim=(0, 50))
    复制代码
    1. plt.show()
    复制代码




▲图3-2

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

    1. # Import Data
    复制代码
    1. df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")
    复制代码


    1. # Draw Stripplot
    复制代码
    1. fig, ax = plt.subplots(figsize=(16,10), dpi= 80)   
    复制代码
    1. sns.stripplot(df.cty, df.hwy, jitter=0.25, size=8, ax=ax, linewidth=.5)
    复制代码


    1. # Decorations
    复制代码
    1. plt.title('Use jittered plots to avoid overlapping of points', fontsize=22)
    复制代码
    1. plt.show()
    复制代码




▲图4

[h2]5. 计数图 (Counts Plot)[/h2]
避免点重叠问题的另一个选择是增加点的大小,这取决于该点中有多少点。因此,点的大小越大,其周围的点的集中度越高。

    1. # Import Data
    复制代码
    1. df = pd.read_csv("https://raw.githubusercontent.com/selva86/datasets/master/mpg_ggplot2.csv")
    复制代码
    1. df_counts = df.groupby(['hwy', 'cty']).size().reset_index(name='counts')
    复制代码


    1. # Draw Stripplot
    复制代码
    1. fig, ax = plt.subplots(figsize=(16,10), dpi= 80)   
    复制代码
    1. sns.stripplot(df_counts.cty, df_counts.hwy, size=df_counts.counts*2, ax=ax)
    复制代码


    1. # Decorations
    复制代码
    1. plt.title('Counts Plot - Size of circle is bigger as more points overlap', fontsize=22)
    复制代码
    1. plt.show()
    复制代码





▲图5

[h2]6. 边缘直方图 (Marginal Histogram)[/h2]
边缘直方图具有沿 X 和 Y 轴变量的直方图。 这用于可视化 X 和 Y 之间的关系以及单独的 X 和 Y 的单变量分布。 这种图经常用于探索性数据分析(EDA)。



▲图6

[h2]7. 边缘箱形图 (Marginal Boxplot)[/h2]
边缘箱图与边缘直方图具有相似的用途。然而,箱线图有助于精确定位 X 和 Y 的中位数、第25和第75百分位数。



▲图7

[h2]8. 相关图 (Correllogram)[/h2]
相关图用于直观地查看给定数据框(或二维数组)中所有可能的数值变量对之间的相关度量。

    1. # Import Dataset
    复制代码
    1. df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mtcars.csv")
    复制代码


    1. # Plot
    复制代码
    1. plt.figure(figsize=(12,10), dpi= 80)
    复制代码
    1. sns.heatmap(df.corr(), xticklabels=df.corr().columns, yticklabels=df.corr().columns, cmap='RdYlGn', center=0, annot=True)
    复制代码


    1. # Decorations
    复制代码
    1. plt.title('Correlogram of mtcars', fontsize=22)
    复制代码
    1. plt.xticks(fontsize=12)
    复制代码
    1. plt.yticks(fontsize=12)
    复制代码
    1. plt.show()
    复制代码




▲图8

[h2]9. 矩阵图 (Pairwise Plot)[/h2]
矩阵图是探索性分析中的最爱,用于理解所有可能的数值变量对之间的关系。它是双变量分析的必备工具。

    1. # Load Dataset
    复制代码
    1. df = sns.load_dataset('iris')
    复制代码


    1. # Plot
    复制代码
    1. plt.figure(figsize=(10,8), dpi= 80)
    复制代码
    1. sns.pairplot(df, kind="scatter", hue="species", plot_kws=dict(s=80, edgecolor="white", linewidth=2.5))
    复制代码
    1. plt.show()
    复制代码




▲图9

    1. # Load Dataset
    复制代码
    1. df = sns.load_dataset('iris')
    复制代码


    1. # Plot
    复制代码
    1. plt.figure(figsize=(10,8), dpi= 80)
    复制代码
    1. sns.pairplot(df, kind="reg", hue="species")
    复制代码
    1. plt.show()
    复制代码




▲图9-2


[h1]02 偏差 (Deviation)[/h1]
[h2]10. 发散型条形图 (Diverging Bars)[/h2]
如果您想根据单个指标查看项目的变化情况,并可视化此差异的顺序和数量,那么散型条形图 (Diverging Bars) 是一个很好的工具。它有助于快速区分数据中组的性能,并且非常直观,并且可以立即传达这一点。

    1. # Prepare Data
    复制代码
    1. df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mtcars.csv")
    复制代码
    1. x = df.loc[:, ['mpg']]
    复制代码
    1. df['mpg_z'] = (x - x.mean())/x.std()
    复制代码
    1. df['colors'] = ['red' if x < 0 else 'green' for x in df['mpg_z']]
    复制代码
    1. df.sort_values('mpg_z', inplace=True)
    复制代码
    1. df.reset_index(inplace=True)
    复制代码


    1. # Draw plot
    复制代码
    1. plt.figure(figsize=(14,10), dpi= 80)
    复制代码
    1. plt.hlines(y=df.index, xmin=0, xmax=df.mpg_z, color=df.colors, alpha=0.4, linewidth=5)
    复制代码


    1. # Decorations
    复制代码
    1. plt.gca().set(ylabel='$Model$', xlabel='$Mileage$')
    复制代码
    1. plt.yticks(df.index, df.cars, fontsize=12)
    复制代码
    1. plt.title('Diverging Bars of Car Mileage', fontdict={'size':20})
    复制代码
    1. plt.grid(linestyle='--', alpha=0.5)
    复制代码
    1. plt.show()
    复制代码




▲图10

[h2]11. 发散型文本 (Diverging Texts)[/h2]
发散型文本 (Diverging Texts)与发散型条形图 (Diverging Bars)相似,如果你想以一种漂亮和可呈现的方式显示图表中每个项目的价值,就可以使用这种方法。

    1. # Prepare Data
    复制代码
    1. df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mtcars.csv")
    复制代码
    1. x = df.loc[:, ['mpg']]
    复制代码
    1. df['mpg_z'] = (x - x.mean())/x.std()
    复制代码
    1. df['colors'] = ['red' if x < 0 else 'green' for x in df['mpg_z']]
    复制代码
    1. df.sort_values('mpg_z', inplace=True)
    复制代码
    1. df.reset_index(inplace=True)
    复制代码


    1. # Draw plot
    复制代码
    1. plt.figure(figsize=(14,14), dpi= 80)
    复制代码
    1. plt.hlines(y=df.index, xmin=0, xmax=df.mpg_z)
    复制代码
    1. for x, y, tex in zip(df.mpg_z, df.index, df.mpg_z):
    复制代码
    1.     t = plt.text(x, y, round(tex, 2), horizontalalignment='right' if x < 0 else 'left',
    复制代码
    1.                  verticalalignment='center', fontdict={'color':'red' if x < 0 else 'green', 'size':14})
    复制代码


    1. # Decorations   
    复制代码
    1. plt.yticks(df.index, df.cars, fontsize=12)
    复制代码
    1. plt.title('Diverging Text Bars of Car Mileage', fontdict={'size':20})
    复制代码
    1. plt.grid(linestyle='--', alpha=0.5)
    复制代码
    1. plt.xlim(-2.5, 2.5)
    复制代码
    1. plt.show()
    复制代码




▲图11

[h2]12. 发散型包点图 (Diverging Dot Plot)[/h2]
发散型包点图 (Diverging Dot Plot)也类似于发散型条形图 (Diverging Bars)。然而,与发散型条形图 (Diverging Bars)相比,条的缺失减少了组之间的对比度和差异。

    1. # Prepare Data
    复制代码
    1. df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mtcars.csv")
    复制代码
    1. x = df.loc[:, ['mpg']]
    复制代码
    1. df['mpg_z'] = (x - x.mean())/x.std()
    复制代码
    1. df['colors'] = ['red' if x < 0 else 'darkgreen' for x in df['mpg_z']]
    复制代码
    1. df.sort_values('mpg_z', inplace=True)
    复制代码
    1. df.reset_index(inplace=True)
    复制代码


    1. # Draw plot
    复制代码
    1. plt.figure(figsize=(14,16), dpi= 80)
    复制代码
    1. plt.scatter(df.mpg_z, df.index, s=450, alpha=.6, color=df.colors)
    复制代码
    1. for x, y, tex in zip(df.mpg_z, df.index, df.mpg_z):
    复制代码
    1.     t = plt.text(x, y, round(tex, 1), horizontalalignment='center',
    复制代码
    1.                  verticalalignment='center', fontdict={'color':'white'})
    复制代码


    1. # Decorations
    复制代码
    1. # Lighten borders
    复制代码
    1. plt.gca().spines["top"].set_alpha(.3)
    复制代码
    1. plt.gca().spines["bottom"].set_alpha(.3)
    复制代码
    1. plt.gca().spines["right"].set_alpha(.3)
    复制代码
    1. plt.gca().spines["left"].set_alpha(.3)
    复制代码


    1. plt.yticks(df.index, df.cars)
    复制代码
    1. plt.title('Diverging Dotplot of Car Mileage', fontdict={'size':20})
    复制代码
    1. plt.xlabel('$Mileage$')
    复制代码
    1. plt.grid(linestyle='--', alpha=0.5)
    复制代码
    1. plt.xlim(-2.5, 2.5)
    复制代码
    1. plt.show()
    复制代码




▲图12

[h2]13. 带标记的发散型棒棒糖图 (Diverging Lollipop Chart with Markers)[/h2]
带标记的棒棒糖图通过强调您想要引起注意的任何重要数据点并在图表中适当地给出推理,提供了一种对差异进行可视化的灵活方式。



▲图13

[h2]14. 面积图 (Area Chart)[/h2]
通过对轴和线之间的区域进行着色,面积图不仅强调峰和谷,而且还强调高点和低点的持续时间。高点持续时间越长,线下面积越大。

    1. import numpy as np
    复制代码
    1. import pandas as pd
    复制代码


    1. # Prepare Data
    复制代码
    1. df = pd.read_csv("https://github.com/selva86/datasets/raw/master/economics.csv", parse_dates=['date']).head(100)
    复制代码
    1. x = np.arange(df.shape[0])
    复制代码
    1. y_returns = (df.psavert.diff().fillna(0)/df.psavert.shift(1)).fillna(0) * 100
    复制代码


    1. # Plot
    复制代码
    1. plt.figure(figsize=(16,10), dpi= 80)
    复制代码
    1. plt.fill_between(x[1:], y_returns[1:], 0, where=y_returns[1:] >= 0, facecolor='green', interpolate=True, alpha=0.7)
    复制代码
  • [code]plt.fill_between(x[1:], y_returns[1:], 0, where=y_returns[1:]
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:26
帖子:13
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP