一张图展示最终效果



皮一下很开心,标签名肯定不是用户想要的,所以在这里尝试了定制化功能

功能&方法:

  • 定制化标签名/标签数量(4个/5个)。实现方法:在第一个界面点击cancel按钮,进入修改界面

  • 根据弹出的图片在修改界面替换标签,如果只有4对标签则置空最后两个,点击确定保存修改



    +重启程序,可见标签修改,根据提示修改各个值,点击确定即可生成你想要对图片啦!(o゚v゚)ノ

弹出图片是一个无奈之举,现在用户界面的功能实在是太有限了,不然为什么叫easygui呢...最近在考虑升级GUI,小伙伴有没有推荐的

下面献上代码

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号 import pandas as pd
import numpy as np
from mpl_toolkits.axisartist.axislines import SubplotZero
import mpl_toolkits.axisartist.axislines as axislines
import numpy as np
import easygui as gui
import os
import 生成参考图片 as sheng
#------------DATA------------
msg='1. 修改维度标签名或数目请点击cancel按钮。\n2. 根据图片,请仅填写弱/强烈偏好的维度,弱偏好=1 强烈偏好=2,每两个空仅填写一个值'
title='弱偏好=1 强烈偏好=2 cancel修改维度标签'
#读取维度名称
f=open('dimension.txt','r+',encoding='utf-8')#dimension.txt其实是csv格式的标签名
text=f.read()
f.close() fields=[i for i in text.split(',') if i]
#fields=['天','王','盖','地','虎','金','木','水','火','土']
os.system('open 1.png')
init_values=[1,'','',2,'',2,1,'','',1]
values=gui.multenterbox(msg,title,fields=fields,values=init_values)#values-->[] #修改维度名称
if values==None:# 点击cancel按钮或关闭
os.system('open 2.png')
fields=['A替换为', 'a替换为', 'B替换为', 'b替换为', 'C替换为', 'c替换为', 'D替换为', 'd替换为', 'E替换为', 'e替换为']
vs=gui.multenterbox('在此可修改维度标签名和维度数目(允许空值)','提示:点击cancel可结束程序',fields=fields)
if vs==None:
os._exit(0)
content=','.join(vs)#csv格式内容
f=open('dimension.txt','w',encoding='utf-8')
f.write(content)
f.close()
sheng.main()#修改提示图片
gui.msgbox('修改成功!重新打开程序生效') os._exit(0) #check
flag=True
for n,value in enumerate(values):
if n%2==0:#只检查偶数项
if value:#该偶数项非空,确保非空项在范围内
value=int(value)
if (0<value<3) == False:
flag=False
print('#该偶数项非空,确保非空项在范围内')
else: #确保下一想为空
if values[n+1]:#next非空
flag=False
print('#该偶数项非空 #确保下一想为空')
else:#该偶数项为空,确保下一想不空
if not values[n+1]:#next为空
flag=False
print('#该偶数项为空,确保下一想不空')
else:#next不空,确保下一想在范围内
if (0<int(values[n+1])<3) == False:
flag=False
print('该偶数项为空,next不空,确保下一想在范围内')
if flag==False:
break
if flag==False:
gui.msgbox('请检查填写数据为1或2,且每两个空仅填写一个值')
os._exit(0)
#check done #维度:在y轴坐标
y=[-0.5,-1.5,-2.5,-3.5,-4.5]
x=[]
# 程度:(x轴坐标)读取
for n,value in enumerate(values):
if n%2==0:#ou shu
if value: #ou shu you zhi
x.append(-1*int(value))
else: #ou shu wu zhi , du qu xia yi ge
x.append(int(values[n+1]))
else:#ji shu tiao guo
pass #维度名称读取
left=[]
right=[]
for n,v in enumerate(fields):
if n%2==0:
left.append(v)
else:
right.append(v) char=''#经销商性格
for i,v,p in zip(x,left,right):
if i >0:
char+=p
else:
char+=v
print('x',x)
print('l',left)
print('right',right) # ------------gui_end---------------
plt.figure(figsize=(7,7))
count=len(x)
plt.barh(y[:count],width=x,height=0.9,color=['red','blue','green','black','orange'],alpha=0.5)
plt.xticks([-2,-1,0,1,2],['A','B','C','D','E']) #初始化x轴标签,该步骤无法设置格式,后续会进一步处理
plt.yticks([])#y轴替换为无ticks显示 plt.xlim([-2,2])# 水平显示范围
plt.ylim([-1*count,0]) # 垂直显示范围
plt.grid(linestyle="--")
#设置坐标轴--------------------------------------------------
ax = plt.gca() ax.spines["right"].set_color("none")
ax.spines["top"].set_color("none")
# 设置x轴标签的方向(标签全部在外面)
ax.xaxis.set_ticks_position('top')
# 设置中心y轴的位置
ax.spines['left'].set_position('center')
# 设置轴的位置
ax.spines['bottom'].set_position(("data",0))#根据坐标设置bottom坐标轴位置
ax.spines['left'].set_color('red')
#第二层上修改x_tick_labels的值、格式
ax.set_xticklabels(['强烈偏好','弱偏好','中立','弱偏好','强烈偏好'],{'color': 'red','fontsize':'15',
'fontweight': '20'})
#---------------------------------------------
# plot right axis
ax2=ax.twinx()
ax2.spines["left"].set_color("none")
ax2.spines["bottom"].set_color("none")
ax2.set_ylim([-1*count,0]) #
ax2.set_yticks([-0.5,-1.5,-2.5,-3.5,-4.5][:count]) #
ax2.set_yticklabels(right,{'color': 'green','fontsize':'15',
'fontweight': '20'}) #---------------------------------------------
# plot left axis
ax3=ax.twinx()
# ax2.set_yticks([1,2,3])
ax3.spines["left"].set_color("none")
ax3.spines["top"].set_color("none")
ax3.spines["bottom"].set_color("none") ax3.spines["right"].set_position(("data",-2))
# 设置y轴标签的方向(标签全部在left)
ax3.yaxis.set_ticks_position('left') ax3.set_ylim([-1*count,0]) #
ax3.set_yticks([-0.5,-1.5,-2.5,-3.5,-4.5][:count]) #
ax3.set_yticklabels(left,{'color': 'green','fontsize':'15',
'fontweight': '20'})
#----------------------------------------------------
name=gui.enterbox('请命名该图','最后一步',default='第 X 号经销商') plt.title('%s'%char,{'color': 'green','fontsize':'20',
'fontweight': '25'},pad=10)
plt.savefig('%s.png'%name)
plt.show()

matplotlib添加坐标轴实现性格测试可视化的更多相关文章

  1. JS 添加千分位,测试可以使用

    JS 添加千分位,测试可以使用 <script language="javascript" type="text/javascript">funct ...

  2. matplotlib 添加注释的方式

    matplotlib 添加注释的方式 matplotlib.pyplot.annotate Annotate the point xy with text s s : str The text of ...

  3. 我的MBTI职业性格测试

    背景 最近在看<程序员的思维训练--开发人之前能的九堂课>,其中讲到了 MBTI 职业性格测试的指导意义.记起来两年多以前在面试 ASES 的时候有做过这个测试,只可惜当时的测试结果在好几 ...

  4. Python之matplotlib库学习:实现数据可视化

    1. 安装和文档 pip install matplotlib 官方文档 为了方便显示图像,还使用了ipython qtconsole方便显示.具体怎么弄网上搜一下就很多教程了. pyplot模块是提 ...

  5. 【 D3.js 入门系列 --- 5 】 如何添加坐标轴

    第3节中做了一个图标,但没有为它添加一个相应的坐标轴,这样不知道每一个柱形到底有多长.这一节做一个坐标轴. D3中的坐标轴都是以 svg 图的形式出现的,这也是为什么在第3节中要使用 svg 的方法做 ...

  6. MBTI性格测试

    INFP 哲学家型——生活在自己的理想世界 报告接收人: 才储成员4361454 日期: 2014/9/2 一.你的MBTI图形 倾向示意图表示四个维度分别的倾向程度.从中间往两侧看,绿色指示条对应下 ...

  7. matplotlib —— 调整坐标轴

    import matplotlib.pyplot as plt import numpy as np # 绘制普通图像 x = np.linspace(-1, 1, 50) y1 = 2 * x + ...

  8. 卡特尔16PF性格测试与答案

    大学生在职业生涯规划时,必须充分注意到自己的性格和职业的适宜性.性格是指一个人在生活中形成的对现实的稳定的态度和行为方式.研究表明,性格影响着一个人的职业取向,由于性格的不同,每个人对工作和职业的态度 ...

  9. 我的MBTI性格测试

    写在前面: 很多人争论MBTI靠谱不靠谱.一个人的性格肯定不能只用这么几个维度就能描述的,一个人的性格也肯定不是通过这么几个问题就能测出来的,一个人的性格也肯定不是一成不变的,所以MBTI的准确度肯定 ...

随机推荐

  1. Linux修复日志

    阿里云后台系统报告漏洞,解决记录 中级: RHSA-2019:0049-重要: systemd 安全更新

  2. Appium学习1-安装

    Appium简介 Appium 是一个开源的.跨平台的测试框架,可以用来测试 Native App.混合应用.移动 Web 应用(H5 应用)等,也是当下互联网企业实现移动自动化测试的重要工具.App ...

  3. linux 6.9 补丁修补漏洞

    1 先将openssh-8.0p1.tar.gz 上传到 root下的/opt 文件夹下 解压  tar -zxvf openssh-8.0p1.tar.gz  -C /opt 2 启动vncserv ...

  4. phpstorm格式化数组

    如果我们想要的这样的数组格式的话,可以设置 <?php $arr = array["a" => 0, "b" => 1, "c&qu ...

  5. B站学习记:贪心与博弈

    贪心 1. poj2287 N匹马的田忌赛马问题 稳稳地赢. 寻找最优的方案. 更优的收益. 有时候,局部最优导致全局最优. 马的能力值. 使得让我赢的局数最多. 对于对方的任何一匹马,如果我的马能打 ...

  6. 颜色color转为rgb格式

    function convertHexToRGB(color) {       if (color.length === 4) {             let extendedColor = &q ...

  7. OpenGL 编程指南 (2)

    1.OpenGL对共享的边有严格的规定:1)共享边上的像素因为同事被两者所覆盖,因此不可能不受到光照计算的影响: 2)共享边上的像素值,不可能受到多于一个三角形的光照计算的影响. 2.多边形存在正面与 ...

  8. Django | Unable to get repr for <class 'django.db.models.query.QuerySet'>

    问题:在mysql中查询数据时,代码如下: skus = category.sku_set.filter(is_launched=True).order_by(sort_field) skus 取不到 ...

  9. 杭电oj_1713——相遇周期(java实现)

    question:相遇周期 思路: 首先将两个分数化为最简形式(也就是分子分母同时除以最大公约数) 然后题意是要求两个分数的最小公倍数 借助以下两个公式,就可以求出结果 1.最小公倍数*最大公约数 = ...

  10. TODO:如何模拟cpu打满,磁盘打满,网卡打满

    背景: 测试活动中,需要构造cpu打满.磁盘打满.网卡打满的场景 场景1:cpu打满 环境信息: 虚拟机,物理核数16个,每个物理核的虚拟核数1个,虚拟核数16个: [root@vm10-0-0-8 ...