前言
今天,群里突然有个小伙伴找人帮忙出个图
然后我就帮他看看是什么图
结果
是个散点图
原来
他是在做大学生数学建模竞赛
他理想的图是这样的:
我极力模仿
最后做出来的图是这样的:
(他说那个虚线不需要)
开始瞎做
这是一个真实的需求案例(虽然是个比赛,但是数据是比较规范的)
数据如下所示:
一共有835条记录
目标就是根据经纬度在二维散点图上定位画散点
散点根据任务执行情况0还是1用两种颜色区分
任务标价大小不同散点大小不同
按照他的要求,只需要画任务标价是65/70/75/80/85的散点
因为我第一次做这种从excel中导入数据绘图
所以我自己摸索
做的代码比较傻,hhhh
代码如下:
import pandas as pd
data = pd.read_excel('data_9_16.xls')
注:打开数据文件
看一下文件头部数据信息:
data.head()
取出一类数据:
data_65_1 = data[(data['任务标价'] == 65) & (data['任务执行情况']== 1)]
data_65_1.head()
为绘图准备x y轴数据:
x_65_1 = data_65_1['任务gps经度']
y_65_1 = data_65_1['任务gps 纬度']
接下来准备其他组数据(这个过程很傻。。。有没有更好的办法,例如做个group by?):
data_65_0 = data[(data['任务标价'] == 65) & (data['任务执行情况']== 0)]
x_65_0 = data_65_0['任务gps经度']
y_65_0 = data_65_0['任务gps 纬度']
data_70_0 = data[(data['任务标价'] == 70) & (data['任务执行情况']== 0)]
x_70_0 = data_70_0['任务gps经度']
y_70_0 = data_70_0['任务gps 纬度']
data_70_1 = data[(data['任务标价'] == 70) & (data['任务执行情况']== 1)]
x_70_1 = data_70_1['任务gps经度']
y_70_1 = data_70_1['任务gps 纬度']
data_75_0 = data[(data['任务标价'] == 75) & (data['任务执行情况']== 0)]
x_75_0 = data_75_0['任务gps经度']
y_75_0 = data_75_0['任务gps 纬度']
data_75_1 = data[(data['任务标价'] == 75) & (data['任务执行情况']== 1)]
x_75_1 = data_75_1['任务gps经度']
y_75_1 = data_75_1['任务gps 纬度']
data_80_0 = data[(data['任务标价'] == 80) & (data['任务执行情况']== 0)]
x_80_0 = data_80_0['任务gps经度']
y_80_0 = data_80_0['任务gps 纬度']
data_80_1 = data[(data['任务标价'] == 80) & (data['任务执行情况']== 1)]
x_80_1 = data_80_1['任务gps经度']
y_80_1 = data_80_1['任务gps 纬度']
data_85_0 = data[(data['任务标价'] == 85) & (data['任务执行情况']== 0)]
x_85_0 = data_85_0['任务gps经度']
y_85_0 = data_85_0['任务gps 纬度']
data_85_1 = data[(data['任务标价'] == 85) & (data['任务执行情况']== 1)]
x_85_1 = data_85_1['任务gps经度']
y_85_1 = data_85_1['任务gps 纬度']
心累啊
之后终于可以绘图了:
%matplotlib inline
import matplotlib.pyplot as plt
plt.scatter(x_65_1, y_65_1, marker = 'o', color = 'g', label='65_1', s = 10, alpha=0.3)
plt.scatter(x_65_0, y_65_0, marker = 'o', color = 'r', label='65_0', s = 10, alpha=0.3)
plt.scatter(x_70_1, y_70_1, marker = 'o', color = 'g', label='70_1', s = 20, alpha=0.3)
plt.scatter(x_70_0, y_70_0, marker = 'o', color = 'r', label='70_0', s = 20, alpha=0.3)
plt.scatter(x_75_1, y_75_1, marker = 'o', color = 'g', label='75_1', s = 30, alpha=0.3)
plt.scatter(x_75_0, y_75_0, marker = 'o', color = 'r', label='75_0', s = 30, alpha=0.3)
plt.scatter(x_80_1, y_80_1, marker = 'o', color = 'g', label='80_1', s = 40, alpha=0.3)
plt.scatter(x_80_0, y_80_0, marker = 'o', color = 'r', label='80_0', s = 40, alpha=0.3)
plt.scatter(x_85_1, y_85_1, marker = 'o', color = 'g', label='85_1', s = 50, alpha=0.3)
plt.scatter(x_85_0, y_85_0, marker = 'o', color = 'r', label='85_0', s = 50, alpha=0.3)
plt.legend(loc = 'lower right')
plt.text(114.25,23.65,'Price tag')
plt.xlabel('Task GPS longitude')
plt.ylabel('Task GPS latitude')
plt.show()
注:alpha代表透明度,如果不透明,会出现点相互覆盖,透明度可以让其显示点的聚集情况,颜色深地方点的密度大。
marker是散点的类型(我想找圆圈形状,但是只能找到圆形,如果有大佬知道,欢迎留言评论,笔芯!)
color代表颜色,r=red红色,g=green绿色
s代表点的大小
我个人想找legend图例的标题怎么设置,奈何没找到,只能将图例移到右下角,上方空出位置用text方法加了一个title
(如果有大佬知道legend的title怎么加,欢迎留言评论,笔芯!)
最终效果如下:
在绘图过程中,遇到问题要多help
在jupyter notebook中可以使用:
?plt.scatter
看scatter散点图绘图方法和参数
用:
import matplotlib
?matplotlib.markers
看可绘制的散点样式
文章中如有不妥之处请指正~感谢