python散点图拟合直线,python散点拟合曲线

  python散点图拟合直线,python散点拟合曲线

  背景

  最近,该项目在写报告时需要使用罗兰贝格图进行数据可视化。罗兰贝格图如下所示,红色代表相对强势的方面,蓝色代表相对弱势的方面。比如比较两个品牌,品牌A和品牌B,品牌A哪里有优势,便利性哪里相对弱。罗兰贝格图能给人直观的印象,形象化能让顾客一眼就判断出来。

  原始罗兰贝格图

  Python等值线图

  Python中的罗兰贝格地图对应等高线地图。等高线图对应于plt.contour函数和plt。matplotlib库中的轮廓函数。等你熟悉了里面的参数之后,基本就可以画图了。由于我们的数据是一个只有几个对应点的表格(矩阵),如果要画出这个不规则的图,只能用插值的方法进行处理,然后需要把图形转换成平滑的形状。

  遇到的困难:

  1,0应该是白色的,需要用来区分红色和蓝色,绘制时需要用自定义函数处理。

  2.为了平滑绘制的图片,需要矩阵二次样条插值方法。

  下面是一步一步的介绍:

  1.添加上下边界

  这个需要在Excel中手动处理,在python中也可以处理,但是相对来说Excel更灵活,你可以直接读取数据,然后后期画图。主要用于画图,画面外围为白色。

  添加上下边界

  2.读出数据

  从Excel文件中读取数据

  读出数据

  3.自定义插值函数

  这里使用的是线性插值。在两点之间插入一个新点,新点的值是两侧点的平均值:

  下面有两个自定义的,一个用来插值二维数据,一个用来插值一维数据。

  自定义插值函数

  4.自定义颜色分割的边界函数。

  主要用于避免等值线图中cmp参数的缺点,使0值作为红蓝的对称中心,将红色分为五个区间,蓝色分为五个区间。在这个自定义函数中,级数参数可以除以等差或等比。默认值为等比例,绘制结果相对更美观。

  自定义颜色分割线

  5.定义坐标点。

  定义坐标点后,使用上面定义的插值函数对X、Y和高度进行线性插值。

  定义坐标点

  进行平滑处理。

  7.画画

  首先你需要用上面定义的颜色分割线函数计算分割线,然后剩下的和正常画图一样。

  绘制设计

  8.决赛成绩

  决赛成绩

  以上是整个罗兰贝格的绘制步骤,所有详细代码如下所示:

  将numpy作为np导入

  进口熊猫作为pd

  将matplotlib.pyplot作为plt导入

  Scipy导入插值#插值参考

  PLT . RC params[ font . sans-serif ]=[ Microsoft ya hei ]

  PLT . RC params[ axes . unicode _ MINUS ]=False

  #加载数据

  Data=pd.read_excel(红色蓝图制作data.xlsx ,sheet _ name= Python-short book ,index_col=0)

  数据

  #自定义插值函数-2D

  def扩展_数据(数据):

  data=np.array(数据)

  定义扩展_x(X):

  data=X.copy()

  n=data.shape[1]

  mid _ extend=NP . zeros(shape=(data . shape[0],n-1))

  out=NP . zeros(shape=(data . shape[0],2*n-1))

  对于范围内的I(n-1):

  mid_extend[:i]=(data[:i] data[:i 1])/2.0

  对于范围内的I(2 * n-1):

  如果i%2==0:

  out[:I]=数据[:0]

  data=np.delete(data,0,axis=1)

  否则:

  out[:i]=mid_extend[:0]

  mid _ extend=NP . delete(mid _ extend,0,axis=1)

  退回去

  定义扩展_y(Y):

  data=Y.T.copy()

  返回extend_x(数据)。T

  data=extend_x(数据)

  data=extend_y(数据)

  返回数据

  #自定义插值函数-一维

  定义扩展_x(X):

  data=X.copy()

  n=data.shape[0]

  mid_extend=np.zeros(n-1)

  out=np.zeros(2*n-1)

  对于范围内的I(n-1):

  mid _ extend[I]=(data[I]data[I 1])/2.0

  对于范围内的I(2 * n-1):

  如果i%2==0:

  out[i]=data[0]

  data=np.delete(data,0)

  否则:

  out[i]=mid_extend[0]

  mid _ extend=NP . delete(mid _ extend,0)

  退回去

  #自定义颜色分割线

  def cmap_def(Height,progression=logspace ):

  White_min白色下限

  White_max白色上界,与白色下界对称。

  n在延伸高度最大值与白色上界等分的数量

  进展日志空间等差数列日志空间等比数列

  返回:级别

  white _ min=-1 * NP。max(NP。ABS(身高))/10 #白色下界

  white _ max=1 * NP。max(NP。ABS(身高))/10 #白色上界,与白色下界对称

  n=6 #在高度最大值与白色上界等分的数量

  Height_max=np.max(np.abs(高度))np.max(np.abs(高度))/10

  if progression==linspace: #线性等差分割点

  等级=列表(NP。Lin space(-1 * Height _ max,white_min,n)) #小于白色下界值等分n

  水平。扩展(列表(NP。Lin space(white _ max,Height_max,n)))

  否则:#等比分割点

  级别=-1 * NP。日志空间(NP。log(white _ max),np.log(Height_max),n,base=np.e)

  levels.sort()

  级别=列表(级别)

  水平。扩展(列表(NP。日志空间(NP。log(white _ max),np.log(Height_max),n,base=np.e)))

  回报水平

  x=np.array([0,1,2,3,4,5,6])

  y=np.array([0,1,2,3,4,5,6])

  高度=数据。值

  #先进行一次线性插值

  n=1

  x_extend=x.copy()

  y_extend=y.copy()

  Height_extend=Height.copy()

  对于范围内的我(n):

  x_extend=extend_x(x_extend)

  y _ extend=扩展x(y _延伸)

  高度扩展=扩展数据(高度扩展)

  #进行矩阵二元样条插值

  Height_R=插值rectbiliariatespline(x _ extend,y_extend,Height_extend,kx=2,ky=2,s=0.0000001)

  x_new=np.linspace(0,6,2000)

  y_new=np.linspace(0,6,2000)

  X_new,Y_new=np.meshgrid(x_new,Y_new)

  Height_new=Height_R(x_new,y_new)

  #颜色分割界线

  levels=cmap_def(高度)

  #自定义颜色阶

  colors=[#0c7fa4 , #3893b4 , #6ebcd2 , #8ec9d6 , #afd5e4 , #ffffff , #f4c0bd , #eb827f , #ea5350 , #de333a , #d41f26]

  #画图

  fig=plt.figure(figsize=(12,6),dpi=255)

  # 填充颜色

  a=plt.contourf(X_new,Y_new,Height_new,levels=levels,alpha=1,colors=colors)

  # 绘制等高线

  c=plt.contour(X_new,Y_new,Height_new,levels=levels,colors=white ,linewidths=0.3,alpha=1,linestyles=solid )

  b=plt.colorbar(a,刻度=级别)

  乙。set _ tick labels(tick labels=[format(I,。1% )为i in levels])

  plt.xticks([1,2,3,4,5],labels=[性格1,性格2,性格3,性格4,性格5])

  plt.yticks([1,2,3,4,5],labels=[产品人群1,产品人群2,产品人群3,产品人群4,产品人群5])

  plt.tick_params(长度=0) #不显示刻度线

  # #去掉顶部、右边边框

  # ax=plt.gca()

  # ax.spines[top].set_visible(False)

  # ax.spines[右]。set_visible(False)

  plt.xlim(0,6)

  plt.ylim(0,6)

  # plt.grid() #网格线

  plt.savefig(a_vs_b红蓝图。巴布亚新几内亚,dpi=255) #保存图片

  plt.show()

  以上是自己实践中遇到的一些点,分享出来供大家参考学习,欢迎关注本简书号

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: