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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。