关于数据的可视化-直方图和二维频次直方图

2020-05-22 00:00:00 数据 数组 区间 直方图 展示

就像将一维数组分为区间创建一维频次直方图一样,我们也可以将二维

数组按照二维区间进行切分,来创建二维频次直方图。

一维直方图主要用hist来展示,二维的关系可以用散点图、多hist叠加、hist2d或seaborn来展现,seaborn的主要数据类型是pandas,因此需要转换,又复习了一下Numpy转pandas。



代码示例

  1. import matplotlib.pyplot as plt

  2. import numpy as np

  3. import seaborn as sns

  4. import pandas as pd

  5. from sklearn import datasets


  6. # 单变量直方图展示

  7. data = np.random.randn(1000)

  8. plt.hist(data)

  9. plt.show()


  10. # 单变量直方图展示,指定分组数,填充类型,填充色彩,透明度

  11. plt.hist(data, bins=30, density=True, alpha=0.5,histtype='stepfilled', color='steelblue', edgecolor='none')

  12. plt.show()



  13. # 加载sklearn的鸢尾花数据集

  14. iris=datasets.load_iris()

  15. titles=['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

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

  17. kwargs = dict(histtype='stepfilled', alpha=0.3, density=True, bins=10)

  18. # 分别查看不同类型鸢尾花在四个维度上的直方图

  19. for i in range(4):

  20. ax = fig.add_subplot(2, 2, i+1)

  21. # 分别获取三种鸢尾花,在同一刻度上展示直方图,通过不同颜色和透明度进行叠加展示

  22. type1=iris.data[iris.target==][:,i]

  23. type2=iris.data[iris.target==1][:,i]

  24. type3=iris.data[iris.target==2][:,i]

  25. plt.hist(type1, **kwargs)

  26. plt.hist(type2, **kwargs)

  27. plt.hist(type3, **kwargs)

  28. plt.title(titles[i])

  29. plt.show()



  30. # 构造身高和体重的线性关系数据-随机数据

  31. # 均值为175,方差为15,且正态分布的1000个随机值

  32. height=np.random.normal(175,15,size=1000)

  33. # 构造体重值随机数

  34. weight = (height - 100) * (0.9+np.random.randn(1000)/50) + np.random.randn(1000)*5

  35. # 标准散点图展示

  36. plt.scatter(height,weight)

  37. plt.show()



  38. # plt.hist2d进行二维直方图展示

  39. plt.hist2d(height,weight, bins=30, cmap='Blues')

  40. cb = plt.colorbar()

  41. cb.set_label('counts in bin')

  42. plt.show()



  43. # plt.hexbin进行六边形区间划分

  44. plt.hexbin(height,weight, gridsize=30, cmap='Blues')

  45. cb = plt.colorbar(label='count in bin')

  46. plt.show()



  47. # 使用seaborn画图,需要使用pandas

  48. print(height.shape)

  49. print(weight.shape)

  50. # 意思是一维数组,数组中有1000个元素

  51. # 一维数组可以进行合并,但无法得到2维数组,需要通过np.newaxis增加一个维度,变成2维数组

  52. # (1000,)

  53. # (1000,)

  54. height = height[:,np.newaxis]

  55. weight = weight[:,np.newaxis]

  56. # 意思是一个二维数组,10001

  57. # (1000, 1)

  58. # (1000, 1)

  59. data=np.hstack((height,weight))

  60. print(data.shape)

  61. # 意思是一个二维数组,10002

  62. # (1000, 2)


  63. # numpy数组转换为pandas类型

  64. pd = pd.DataFrame(data,columns=['height','weight'])

  65. # seaborn散点图

  66. sns.set(style="white", color_codes=True)

  67. sns.jointplot(x="height",y="weight",data=pd);

  68. plt.show()



  69. # seaborn线性回归图

  70. sns.jointplot(x="height",y="weight",data=pd, kind="reg")

  71. plt.show()



  72. # seaborn六边形区间划分

  73. sns.jointplot(x="height",y="weight",data=pd, kind="hex")

  74. plt.show()



  75. # seaborn核密度图

  76. sns.jointplot(x="height",y="weight",data=pd, kind="kde");

  77. plt.show()



  78. # 两个维度的核密度

  79. f, ax = plt.subplots(figsize=(6, 6))

  80. sns.kdeplot(pd['height'], pd['weight'], ax=ax)

  81. sns.rugplot(pd['height'], color="g", ax=ax)

  82. sns.rugplot(pd['weight'], vertical=True, ax=ax);

  83. plt.show()



  84. # 核密度图,色彩方面更加迷幻一些

  85. f, ax = plt.subplots(figsize=(6, 6))

  86. cmap = sns.cubehelix_palette(as_cmap=True, dark=, light=1, reverse=True)

  87. sns.kdeplot(pd['height'], pd['weight'], cmap=cmap, n_levels=60, shade=True);

  88. plt.show()



  89. # 核密度中增加数据三点

  90. g = sns.jointplot(x="height", y="weight", data=pd, kind="kde", color="r")

  91. g.plot_joint(plt.scatter, c="b", s=30, linewidth=1, marker="+")

  92. g.ax_joint.collections[].set_alpha()

  93. g.set_axis_labels("height", "weight");

  94. plt.show()
















相关文章