项目的难点在于边界的逻辑关系,
.
如上图所示,数据分为两列,将数据作于图中,放于不同的方块之中。作图效果如下图所示:
第一步:选择数据。因为不确定图的坐标范围,因此确定x/y轴的最大最小值,并通过行列数确认间距。
filename = input('请输入文件名字:') # 输入相关参数
# row = int(input('请输入图的行数:'))
# column = int(input('请输入图的行数:'))
row = 6
column = 6
filename = filename + '.csv'
data = pd.read_csv(filename, header=None) # 引入数据
data = data.iloc[:, [3, 6]] # 选择数据列
ydata = data.iloc[:, 0] # 选择x y 数据及其最值
xdata = data.iloc[:, 1]
ymin = ydata.min()
ymax = ydata.max()
xmin = xdata.min()
xmax = xdata.max()
yjian = (ymax-ymin)/row # 确定间距,根据自己情况调整
xjian = (xmax-xmin)/column
第二步:确定坐标数值。因为间距不确定,因此每个坐标值也不确定,需要人为确定数值。
ylist = [] # 确定坐标数据
for i in np.arange(ymin, ymax, yjian):
ylist.append(round(i, 2)) # 因为坐标不一定是整数,注意保留数值
ylist.append(ymax)
xlist = []
for i in np.arange(xmin, xmax, xjian):
xlist.append(round(i, 2))
xlist.append(xmax)
第三步:确定每个空格里面的具体数值,分为两部分。因为一个区间的两个边界值不可同时取到,因此分为左边界值和区间值+右边界值两部分。注意xlist/ylist/m n 顺序。
list1 = [] # 确定每个区间和左边界的数值
for b, s in zip(xlist[:-1], xlist[1:]):
for k, a in zip(ylist[:-1], ylist[1:]):
p = 0
for m, n in zip(data.iloc[:, 0], data.iloc[:, 1]):
if (((m >= k) & (m < a)) & ((n >= b) & (n < s))):
p += 1
list1.append(p)
list2 = [] # 确定右边界的值
for b, s in zip(xlist[:-1], xlist[1:]):
for k, a in zip(ylist[:-1], ylist[1:]):
p = 0
for m, n in zip(data.iloc[:, 0], data.iloc[:, 1]):
if ((((m == ymax) & (m < k+ yjian + 0.01)) & ((n >= b) & (n <s ))) | (((m >= k) & (m < a)) & ((n == xmax) & (n < b + xjian + 0.01 ))) | (m == ymax & n == xmax)) : #需要考虑到各种情况,因为前边四舍五入到第二位,故加0.01,当然0.02也可以。
p += 1
list2.append(p)
list3 = [] # 两种情况的数据相加合并
for i, j in zip(list1, list2):
sum = i + j
list3.append(sum)
第四步:添加百分比号,使用数字计算出小数后当做字符添加%号
list4 = [] # 添加百分比符号
for i in list3:
i = round(i/data.shape[0]*100, 2) # 10个数据,所以是“区间的数据数量/10*100=区间的数据数量*10”,根据自己情况调整
i = str(i) + str('%')
list4.append(i)
第五步:提供底图,为后期数据提供位置。
plt.figure(figsize=(8, 6)) # 绘图
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.xticks(xlist)
plt.yticks(ylist)
plt.tick_params(labelsize=15)
第六步:添加空格里的数据,主要是通过plt.text格式设置文本位置。
array1 = np.array(list4).reshape(column, row).T #reshape 里面的顺序是yjian和xjian后面的数字
for i in xlist[:-1]:
for j in ylist[:-1]:
plt.text(i+0.5, j+0.07, array1[ylist.index(j), xlist.index(i)], fontsize=18)
plt.grid()
plt.savefig('data.jpg', dpi=150)
plt.show()
完整代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
while True:
filename = input('请输入文件名字:') # 输入相关参数
row = 6
column = 6
filename = filename + '.csv'
data = pd.read_csv(filename, header=None) # 引入数据
data = data.iloc[:, [3, 6]] # 选择数据列
ydata = data.iloc[:, 0] # 选择x y 数据及其最值
xdata = data.iloc[:, 1]
ymin = ydata.min()
ymax = ydata.max()
xmin = xdata.min()
xmax = xdata.max()
yjian = (ymax-ymin)/row # 确定间距,根据自己情况调整
xjian = (xmax-xmin)/column
ylist = [] # 确定坐标数据
for i in np.arange(ymin, ymax, yjian):
ylist.append(round(i, 2))
ylist.append(ymax)
xlist = []
for i in np.arange(xmin, xmax, xjian):
xlist.append(round(i, 2))
xlist.append(xmax)
list1 = [] # 确定每个区间的数值
for b, s in zip(xlist[:-1], xlist[1:]):
for k, a in zip(ylist[:-1], ylist[1:]):
p = 0
for m, n in zip(data.iloc[:, 0], data.iloc[:, 1]):
if (((m >= k) & (m < a)) & ((n >= b) & (n < s))):
p += 1
list1.append(p)
list2 = []
for b, s in zip(xlist[:-1], xlist[1:]):
for k, a in zip(ylist[:-1], ylist[1:]):
p = 0
for m, n in zip(data.iloc[:, 0], data.iloc[:, 1]):
if ((((m == ymax) & (m < k+ yjian + 0.01)) & ((n >= b) & (n <s ))) | (((m >= k) & (m < a)) & ((n == xmax) & (n < b + xjian + 0.01 ))) | (m == ymax & n == xmax)) :
p += 1
list2.append(p)
list3 = []
for i, j in zip(list1, list2):
sum = i + j
list3.append(sum)
list4 = [] # 添加百分比符号
for i in list3:
i = round(i/data.shape[0]*100, 2) # 10个数据,所以是“区间的数据数量/10*100=区间的数据数量*10”,根据自己情况调整
i = str(i) + str('%')
list4.append(i)
array1 = np.array(list4).reshape(column, row).T #reshape 里面的顺序是yjian和xjian后面的数字
plt.figure(figsize=(8, 6)) # 绘图
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
plt.xticks(xlist)
plt.yticks(ylist)
plt.tick_params(labelsize=15)
for i in xlist[:-1]:
for j in ylist[:-1]:
plt.text(i+0.5, j+0.07, array1[ylist.index(j), xlist.index(i)], fontsize=18)
plt.grid()
plt.savefig('data.jpg', dpi=150)
plt.show()