Matplotlib可视化最有价值的50个图表(附完整Python源代码)

2019-01-15 17:29:00
刘大牛
转自文章
229

本文总结了50个图表绘制方法,对于数据分析的可视化有莫大的作用。

from Unsplash by @Mike Enerio

Tips: 

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

  • 所有正确的源代码,已整合到 jupyter notebook 文件中; 

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

数据分析 和可视化中最有用的 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()    

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

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

  1. from matplotlib import patches

  2. from scipy.spatial import ConvexHull

  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.    if not 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()    

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()

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

或者,可以在其每列中显示每个组的最佳拟合线。 可以通过在 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()

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()

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 overlap, fontsize=22)

  9. plt.show()

6. 边缘直方图 (Marginal Histogram)

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

7. 边缘箱形图 (Marginal Boxplot)

边缘箱图与边缘直方图具有相似的用途。 然而,箱线图有助于精确定位 X 和 Y 的中位数、第25和第75百分位数。

8. 相关图 (Correllogram)

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

  1. # Import Dataset

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

  3. # Plot

  4. plt.figure(figsize=(12,10), dpi= 80)

  5. sns.heatmap(df.corr(), xticklabels=df.corr().columns, yticklabels=df.corr().columns, cmap=RdYlGn, center=0, annot=True)

  6. # Decorations

  7. plt.title(Correlogram of mtcars, fontsize=22)

  8. plt.xticks(fontsize=12)

  9. plt.yticks(fontsize=12)

  10. plt.show()

9. 矩阵图 (Pairwise Plot)

矩阵图是探索性分析中的最爱,用于理解所有可能的数值变量对之间的关系。 它是双变量分析的必备工具。

  1. # Load Dataset

  2. df = sns.load_dataset(iris)

  3. # Plot

  4. plt.figure(figsize=(10,8), dpi= 80)

  5. sns.pairplot(df, kind="scatter", hue="species", plot_kws=dict(s=80, edgecolor="white", linewidth=2.5))

  6. plt.show()

  1. # Load Dataset

  2. df = sns.load_dataset(iris)

  3. # Plot

  4. plt.figure(figsize=(10,8), dpi= 80)

  5. sns.pairplot(df, kind="reg", hue="species")

  6. plt.show()

二、偏差 (Deviation)

10. 发散型条形图 (Diverging Bars)

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

  1. # Prepare Data

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

  3. x = df.loc[:, [mpg]]

  4. df[mpg_z] = (x - x.mean())/x.std()

  5. df[colors] = [red if x < 0 else green for x in df[mpg_z]]

  6. df.sort_values(mpg_z, inplace=True)

  7. df.reset_index(inplace=True)

  8. # Draw plot

  9. plt.figure(figsize=(14,10), dpi= 80)

  10. plt.hlines(y=df.index, xmin=0, xmax=df.mpg_z, color=df.colors, alpha=0.4, linewidth=5)

  11. # Decorations

  12. plt.gca().set(ylabel=$Model$, xlabel=$Mileage$)

  13. plt.yticks(df.index, df.cars, fontsize=12)

  14. plt.title(Diverging Bars of Car Mileage, fontdict={size:20})

  15. plt.grid(linestyle=--, alpha=0.5)

  16. plt.show()

11. 发散型文本 (Diverging Texts)

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

  1. # Prepare Data

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

  3. x = df.loc[:, [mpg]]

  4. df[mpg_z] = (x - x.mean())/x.std()

  5. df[colors] = [red if x < 0 else green for x in df[mpg_z]]

  6. df.sort_values(mpg_z, inplace=True)

  7. df.reset_index(inplace=True)

  8. # Draw plot

  9. plt.figure(figsize=(14,14), dpi= 80)

  10. plt.hlines(y=df.index, xmin=0, xmax=df.mpg_z)

  11. for x, y, tex in zip(df.mpg_z, df.index, df.mpg_z):

  12.    t = plt.text(x, y, round(tex, 2), horizontalalignment=right if x < 0 else left,

  13.                 verticalalignment=center, fontdict={color:red if x < 0 else green, size:14})

  14. # Decorations    

  15. plt.yticks(df.index, df.cars, fontsize=12)

  16. plt.title(Diverging Text Bars of Car Mileage, fontdict={size:20})

  17. plt.grid(linestyle=--, alpha=0.5)

  18. plt.xlim(-2.5, 2.5)

  19. plt.show()

12. 发散型包点图 (Diverging Dot Plot)

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

  1. # Prepare Data

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

  3. x = df.loc[:, [mpg]]

  4. df[mpg_z] = (x - x.mean())/x.std()

  5. df[colors] = [red if x < 0 else darkgreen for x in df[mpg_z]]

  6. df.sort_values(mpg_z, inplace=True)

  7. df.reset_index(inplace=True)

  8. # Draw plot

  9. plt.figure(figsize=(14,16), dpi= 80)

  10. plt.scatter(df.mpg_z, df.index, s=450, alpha=.6, color=df.colors)

  11. for x, y, tex in zip(df.mpg_z, df.index, df.mpg_z):

  12.    t = plt.text(x, y, round(tex, 1), horizontalalignment=center,

  13.                 verticalalignment=center, fontdict={color:white})

  14. # Decorations

  15. # Lighten borders

  16. plt.gca().spines["top"].set_alpha(.3)

  17. plt.gca().spines["bottom"].set_alpha(.3)

  18. plt.gca().spines["right"].set_alpha(.3)

  19. plt.gca().spines["left"].set_alpha(.3)

  20. plt.yticks(df.index, df.cars)

  21. plt.title(Diverging Dotplot of Car Mileage, fontdict={size:20})

  22. plt.xlabel($Mileage$)

  23. plt.grid(linestyle=--, alpha=0.5)

  24. plt.xlim(-2.5, 2.5)

  25. plt.show()

13. 带标记的发散型棒棒糖图 (Diverging Lollipop Chart with Markers)

带标记的棒棒糖图通过强调您想要引起注意的任何重要数据点并在图表中适当地给出推理,提供了一种对差异进行可视化的灵活方式。

14. 面积图 (Area Chart)

通过对轴和线之间的区域进行着色,面积图不仅强调峰和谷,而且还强调高点和低点的持续时间。 高点持续时间越长,线下面积越大。

  1. import numpy as np

  2. import pandas as pd

  3. # Prepare Data

  4. df = pd.read_csv("https://github.com/selva86/datasets/raw/master/economics.csv", parse_dates=[date]).head(100)

  5. x = np.arange(df.shape[0])

  6. y_returns = (df.psavert.diff().fillna(0)/df.psavert.shift(1)).fillna(0) * 100

  7. # Plot

  8. plt.figure(figsize=(16,10), dpi= 80)

  9. plt.fill_between(x[1:], y_returns[1:], 0, where=y_returns[1:] >= 0, facecolor=green, interpolate=True, alpha=0.7)

  10. plt.fill_between(x[1:], y_returns[1:], 0, where=y_returns[1:] <= 0, facecolor=red, interpolate=True, alpha=0.7)

  11. # Annotate

  12. plt.annotate(Peak 1975, xy=(94.0, 21.0), xytext=(88.0, 28),

  13.             bbox=dict(boxstyle=square, fc=firebrick),

  14.             arrowprops=dict(facecolor=steelblue, shrink=0.05), fontsize=15, color=white)

  15. # Decorations

  16. xtickvals = [str(m)[:3].upper()+"-"+str(y) for y,m in zip(df.date.dt.year, df.date.dt.month_name())]

  17. plt.gca().set_xticks(x[::6])

  18. plt.gca().set_xticklabels(xtickvals[::6], rotation=90, fontdict={horizontalalignment: center, verticalalignment: center_baseline})

  19. plt.ylim(-35,35)

  20. plt.xlim(1,100)

  21. plt.title("Month Economics Return %", fontsize=22)

  22. plt.ylabel(Monthly returns %)

  23. plt.grid(alpha=0.5)

  24. plt.show()

三、排序 (Ranking)

15. 有序条形图 (Ordered Bar Chart)

有序条形图有效地传达了项目的排名顺序。 但是,在图表上方添加度量标准的值,用户可以从图表本身获取精确信息。

16. 棒棒糖图 (Lollipop Chart)

棒棒糖图表以一种视觉上令人愉悦的方式提供与有序条形图类似的目的。

  1. # Prepare Data

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

  3. df = df_raw[[cty, manufacturer]].groupby(manufacturer).apply(lambda x: x.mean())

  4. df.sort_values(cty, inplace=True)

  5. df.reset_index(inplace=True)

  6. # Draw plot

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

  8. ax.vlines(x=df.index, ymin=0, ymax=df.cty, color=firebrick, alpha=0.7, linewidth=2)

  9. ax.scatter(x=df.index, y=df.cty, s=75, color=firebrick, alpha=0.7)

  10. # Title, Label, Ticks and Ylim

  11. ax.set_title(Lollipop Chart for Highway Mileage, fontdict={size:22})

  12. ax.set_ylabel(Miles Per Gallon)

  13. ax.set_xticks(df.index)

  14. ax.set_xticklabels(df.manufacturer.str.upper(), rotation=60, fontdict={horizontalalignment: right, size:12})

  15. ax.set_ylim(0, 30)

  16. # Annotate

  17. for row in df.itertuples():

  18.    ax.text(row.Index, row.cty+.5, s=round(row.cty, 2), horizontalalignment= center, verticalalignment=bottom, fontsize=14)

  19. plt.show()

17. 包点图 (Dot Plot)

包点图表传达了项目的排名顺序,并且由于它沿水平轴对齐,因此您可以更容易地看到点彼此之间的距离。

  1. # Prepare Data

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

  3. df = df_raw[[cty, manufacturer]].groupby(manufacturer).apply(lambda x: x.mean())

  4. df.sort_values(cty, inplace=True)

  5. df.reset_index(inplace=True)

  6. # Draw plot

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

  8. ax.hlines(y=df.index, xmin=11, xmax=26, color=gray, alpha=0.7, linewidth=1, linestyles=dashdot)

  9. ax.scatter(y=df.index, x=df.cty, s=75, color=firebrick, alpha=0.7)

  10. # Title, Label, Ticks and Ylim

  11. ax.set_title(Dot Plot for Highway Mileage, fontdict={size:22})

  12. ax.set_xlabel(Miles Per Gallon)

  13. ax.set_yticks(df.index)

  14. ax.set_yticklabels(df.manufacturer.str.title(), fontdict={horizontalalignment: right})

  15. ax.set_xlim(10, 27)

  16. plt.show()

18. 坡度图 (Slope Chart)

坡度图最适合比较给定人/项目的“前”和“后”位置。

19. 哑铃图 (Dumbbell Plot)

哑铃图表传达了各种项目的“前”和“后”位置以及项目的等级排序。 如果您想要将特定项目/计划对不同对象的影响可视化,那么它非常有用。

四、分布 (Distribution)

20. 连续变量的直方图 (Histogram for Continuous Variable)

直方图显示给定变量的频率分布。下面的图表示基于类型变量对频率条进行分组,从而更好地了解连续变量和类型变量。

  1. # Import Data

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

  3. # Prepare data

  4. x_var = displ

  5. groupby_var = class

  6. df_agg = df.loc[:, [x_var, groupby_var]].groupby(groupby_var)

  7. vals = [df[x_var].values.tolist() for i, df in df_agg]

  8. # Draw

  9. plt.figure(figsize=(16,9), dpi= 80)

  10. colors = [plt.cm.Spectral(i/float(len(vals)-1)) for i in range(len(vals))]

  11. n, bins, patches = plt.hist(vals, 30, stacked=True, density=False, color=colors[:len(vals)])

  12. # Decoration

  13. plt.legend({group:col for group, col in zip(np.unique(df[groupby_var]).tolist(), colors[:len(vals)])})

  14. plt.title(f"Stacked Histogram of ${x_var}$ colored by ${groupby_var}$", fontsize=22)

  15. plt.xlabel(x_var)

  16. plt.ylabel("Frequency")

  17. plt.ylim(0, 25)

  18. plt.xticks(ticks=bins[::3], labels=[round(b,1) for b in bins[::3]])

  19. plt.show()

21. 类型变量的直方图 (Histogram for Categorical Variable)

类型变量的直方图显示该变量的频率分布。 通过对条形图进行着色,可以将分布与表示颜色的另一个类型变量相关联。

  1. # Import Data

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

  3. # Prepare data

  4. x_var = manufacturer

  5. groupby_var = class

  6. df_agg = df.loc[:, [x_var, groupby_var]].groupby(groupby_var)

  7. vals = [df[x_var].values.tolist() for i, df in df_agg]

  8. # Draw

  9. plt.figure(figsize=(16,9), dpi= 80)

  10. colors = [plt.cm.Spectral(i/float(len(vals)-1)) for i in range(len(vals))]

  11. n, bins, patches = plt.hist(vals, df[x_var].unique().__len__(), stacked=True, density=False, color=colors[:len(vals)])

  12. # Decoration

  13. plt.legend({group:col for group, col in zip(np.unique(df[groupby_var]).tolist(), colors[:len(vals)])})

  14. plt.title(f"Stacked Histogram of ${x_var}$ colored by ${groupby_var}$", fontsize=22)

  15. plt.xlabel(x_var)

  16. plt.ylabel("Frequency")

  17. plt.ylim(0, 40)

  18. plt.xticks(ticks=bins, labels=np.unique(df[x_var]).tolist(), rotation=90, horizontalalignment=left)

  19. plt.show()

22. 密度图 (Density Plot)

密度图是一种常用工具,用于可视化连续变量的分布。 通过“响应”变量对它们进行分组,您可以检查 X 和 Y 之间的关系。以下情况用于表示目的,以描述城市里程的分布如何随着汽缸数的变化而变化。

  1. # Import Data

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

  3. # Draw Plot

  4. plt.figure(figsize=(16,10), dpi= 80)

  5. sns.kdeplot(df.loc[df[cyl] == 4, "cty"], shade=True, color="g", label="Cyl=4", alpha=.7)

  6. sns.kdeplot(df.loc[df[cyl] == 5, "cty"], shade=True, color="deeppink", label="Cyl=5", alpha=.7)

  7. sns.kdeplot(df.loc[df[cyl] == 6, "cty"], shade=True, color="dodgerblue", label="Cyl=6", alpha=.7)

  8. sns.kdeplot(df.loc[df[cyl] == 8, "cty"], shade=True, color="orange", label="Cyl=8", alpha=.7)

  9. # Decoration

  10. plt.title(Density Plot of City Mileage by n_Cylinders, fontsize=22)

  11. plt.legend()

  12. plt.show()

23. 直方密度线图 (Density Curves with Histogram)

带有直方图的密度曲线汇集了两个图所传达的集体信息,因此您可以将它们放在一个图中而不是两个图中。

  1. # Import Data

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

  3. # Draw Plot

  4. plt.figure(figsize=(13,10), dpi= 80)

  5. sns.distplot(df.loc[df[class] == compact, "cty"], color="dodgerblue", label="Compact", hist_kws={alpha:.7}, kde_kws={linewidth:3})

  6. sns.distplot(df.loc[df[class] == suv, "cty"], color="orange", label="SUV", hist_kws={alpha:.7}, kde_kws={linewidth:3})

  7. sns.distplot(df.loc[df[class] == minivan, "cty"], color="g", label="minivan", hist_kws={alpha:.7}, kde_kws={linewidth:3})

  8. plt.ylim(0, 0.35)

  9. # Decoration

  10. plt.title(Density Plot of City Mileage by Vehicle Type, fontsize=22)

  11. plt.legend()

  12. plt.show()

24. Joy Plot

Joy Plot允许不同组的密度曲线重叠,这是一种可视化大量分组数据的彼此关系分布的好方法。 它看起来很悦目,并清楚地传达了正确的信息。 它可以使用基于 matplotlib 的 joypy 包轻松构建。 

注:需要安装 joypy 库

  1. # !pip install joypy

  2. # Python数据之道 备注

  3. import joypy

  4. # Import Data

  5. mpg = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")

  6. # Draw Plot

  7. plt.figure(figsize=(16,10), dpi= 80)

  8. fig, axes = joypy.joyplot(mpg, column=[hwy, cty], by="class", ylim=own, figsize=(14,10))

  9. # Decoration

  10. plt.title(Joy Plot of City and Highway Mileage by Class, fontsize=22)

  11. plt.show()

25. 分布式包点图 (Distributed Dot Plot)

分布式包点图显示按组分割的点的单变量分布。 点数越暗,该区域的数据点集中度越高。 通过对中位数进行不同着色,组的真实定位立即变得明显。

26. 箱形图 (Box Plot)

箱形图是一种可视化分布的好方法,记住中位数、第25个第45个四分位数和异常值。 但是,您需要注意解释可能会扭曲该组中包含的点数的框的大小。 因此,手动提供每个框中的观察数量可以帮助克服这个缺点。

例如,左边的前两个框具有相同大小的框,即使它们的值分别是5和47。 因此,写入该组中的观察数量是必要的。

  1. # Import Data

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

  3. # Draw Plot

  4. plt.figure(figsize=(13,10), dpi= 80)

  5. sns.boxplot(x=class, y=hwy, data=df, notch=False)

  6. # Add N Obs inside boxplot (optional)

  7. def add_n_obs(df,group_col,y):

  8.    medians_dict = {grp[0]:grp[1][y].median() for grp in df.groupby(group_col)}

  9.    xticklabels = [x.get_text() for x in plt.gca().get_xticklabels()]

  10.    n_obs = df.groupby(group_col)[y].size().values

  11.    for (x, xticklabel), n_ob in zip(enumerate(xticklabels), n_obs):

  12.        plt.text(x, medians_dict[xticklabel]*1.01, "#obs : "+str(n_ob), horizontalalignment=center, fontdict={size:14}, color=white)

  13. add_n_obs(df,group_col=class,y=hwy)    

  14. # Decoration

  15. plt.title(Box Plot of Highway Mileage by Vehicle Class, fontsize=22)

  16. plt.ylim(10, 40)

  17. plt.show()

27. 包点+箱形图 (Dot + Box Plot)

包点+箱形图 (Dot + Box Plot)传达类似于分组的箱形图信息。 此外,这些点可以了解每组中有多少数据点。

  1. # Import Data

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

  3. # Draw Plot

  4. plt.figure(figsize=(13,10), dpi= 80)

  5. sns.boxplot(x=class, y=hwy, data=df, hue=cyl)

  6. sns.stripplot(x=class, y=hwy, data=df, color=black, size=3, jitter=1)

  7. for i in range(len(df[class].unique())-1):

  8.    plt.vlines(i+.5, 10, 45, linestyles=solid, colors=gray, alpha=0.2)

  9. # Decoration

  10. plt.title(Box Plot of Highway Mileage by Vehicle Class, fontsize=22)

  11. plt.legend(title=Cylinders)

  12. plt.show()

28. 小提琴图 (Violin Plot)

小提琴图是箱形图在视觉上令人愉悦的替代品。 小提琴的形状或面积取决于它所持有的观察次数。 但是,小提琴图可能更难以阅读,并且在专业设置中不常用。

  1. # Import Data

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

  3. # Draw Plot

  4. plt.figure(figsize=(13,10), dpi= 80)

  5. sns.violinplot(x=class, y=hwy, data=df, scale=width, inner=quartile)

  6. # Decoration

  7. plt.title(Violin Plot of Highway Mileage by Vehicle Class, fontsize=22)

  8. plt.show()

29. 人口金字塔 (Population Pyramid)

人口金字塔可用于显示由数量排序的组的分布。 或者它也可以用于显示人口的逐级过滤,因为它在下面用于显示有多少人通过营销渠道的每个阶段。

  1. # Read data

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

  3. # Draw Plot

  4. plt.figure(figsize=(13,10), dpi= 80)

  5. group_col = Gender

  6. order_of_bars = df.Stage.unique()[::-1]

  7. colors = [plt.cm.Spectral(i/float(len(df[group_col].unique())-1)) for i in range(len(df[group_col].unique()))]

  8. for c, group in zip(colors, df[group_col].unique()):

  9.    sns.barplot(x=Users, y=Stage, data=df.loc[df[group_col]==group, :], order=order_of_bars, color=c, label=group)

  10. # Decorations    

  11. plt.xlabel("$Users$")

  12. plt.ylabel("Stage of Purchase")

  13. plt.yticks(fontsize=12)

  14. plt.title("Population Pyramid of the Marketing Funnel", fontsize=22)

  15. plt.legend()

  16. plt.show()

30. 分类图 (Categorical Plots)

由 seaborn库 提供的分类图可用于可视化彼此相关的2个或更多分类变量的计数分布。

  1. # Load Dataset

  2. titanic = sns.load_dataset("titanic")

  3. # Plot

  4. g = sns.catplot("alive", col="deck", col_wrap=4,

  5.                data=titanic[titanic.deck.notnull()],

  6.                kind="count", height=3.5, aspect=.8,

  7.                palette=tab20)

  8. fig.suptitle(sf)

  9. plt.show()



  1. # Load Dataset

  2. titanic = sns.load_dataset("titanic")

  3. # Plot

  4. sns.catplot(x="age", y="embark_town",

  5.            hue="sex", col="class",

  6.            data=titanic[titanic.embark_town.notnull()],

  7.            orient="h", height=5, aspect=1, palette="tab10",

  8.            kind="violin", dodge=True, cut=0, bw=.2)

五、组成 (Composition)

31. 华夫饼图 (Waffle Chart)

可以使用 pywaffle包 创建华夫饼图,并用于显示更大群体中的组的组成。

注:需要安装 pywaffle 库

  1. #! pip install pywaffle

  2. # Reference: https://stackoverflow.com/questions/41400136/how-to-do-waffle-charts-in-python-square-piechart

  3. from pywaffle import Waffle

  4. # Import

  5. df_raw = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")

  6. # Prepare Data

  7. df = df_raw.groupby(class).size().reset_index(name=counts)

  8. n_categories = df.shape[0]

  9. colors = [plt.cm.inferno_r(i/float(n_categories)) for i in range(n_categories)]

  10. # Draw Plot and Decorate

  11. fig = plt.figure(

  12.    FigureClass=Waffle,

  13.    plots={

  14.        111: {

  15.            values: df[counts],

  16.            labels: ["{0} ({1})".format(n[0], n[1]) for n in df[[class, counts]].itertuples()],

  17.            legend: {loc: upper left, bbox_to_anchor: (1.05, 1), fontsize: 12},

  18.            title: {label: # Vehicles by Class, loc: center, fontsize:18}

  19.        },

  20.    },

  21.    rows=7,

  22.    colors=colors,

  23.    figsize=(16, 9)

  24. )

32. 饼图 (Pie Chart)

饼图是显示组成的经典方式。 然而,现在通常不建议使用它,因为馅饼部分的面积有时会变得误导。 因此,如果您要使用饼图,强烈建议明确记下饼图每个部分的百分比或数字。

  1. # Import

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

  3. # Prepare Data

  4. df = df_raw.groupby(class).size()

  5. # Make the plot with pandas

  6. df.plot(kind=pie, subplots=True, figsize=(8, 8))

  7. plt.title("Pie Chart of Vehicle Class - Bad")

  8. plt.ylabel("")

  9. plt.show()

33. 树形图 (Treemap)

树形图类似于饼图,它可以更好地完成工作而不会误导每个组的贡献。

注:需要安装 squarify 库

  1. # pip install squarify

  2. import squarify

  3. # Import Data

  4. df_raw = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")

  5. # Prepare Data

  6. df = df_raw.groupby(class).size().reset_index(name=counts)

  7. labels = df.apply(lambda x: str(x[0]) + " (" + str(x[1]) + ")", axis=1)

  8. sizes = df[counts].values.tolist()

  9. colors = [plt.cm.Spectral(i/float(len(labels))) for i in range(len(labels))]

  10. # Draw Plot

  11. plt.figure(figsize=(12,8), dpi= 80)

  12. squarify.plot(sizes=sizes, label=labels, color=colors, alpha=.8)

  13. # Decorate

  14. plt.title(Treemap of Vechile Class)

  15. plt.axis(off)

  16. plt.show()

34. 条形图 (Bar Chart)

条形图是基于计数或任何给定指标可视化项目的经典方式。 在下面的图表中,我为每个项目使用了不同的颜色,但您通常可能希望为所有项目选择一种颜色,除非您按组对其进行着色。 颜色名称存储在下面代码中的all_colors中。 您可以通过在 plt.plot()中设置颜色 参数 来更改条的颜色。

  1. import random

  2. # Import Data

  3. df_raw = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")

  4. # Prepare Data

  5. df = df_raw.groupby(manufacturer).size().reset_index(name=counts)

  6. n = df[manufacturer].unique().__len__()+1

  7. all_colors = list(plt.cm.colors.cnames.keys())

发表评论
评论通过审核后显示。
文章分类
联系我们
联系人: 透明七彩巨人
Email: weok168@gmail.com
© 2013- 2024 透明七彩巨人-tmqcjr.com   
SQL查询: 26
内存占用: 8.25MB
PHP 执行时间: 0.1