精华内容
下载资源
问答
  • 中国行政边界(省、市、县)包含国界九段线矢量shp;国家基础信息中心2017年数据整合,很全的信息~~~~~
  • 因为网上找到的地图很多都是国外做的,争议领土都在对立面,故7月20号从阿里爬了最新国内地图的数据,基本是现在网上能找到的最新的地图了,包括省,市,县的轮廓,同时包括南海段线(之前是九段线,2014年改为...
  • 因为网上找到的地图很多都是国外做的,争议领土都在对立面,故7月20号从阿里爬了最新国内地图的数据,基本是现在网上能找到的最新的地图了,包括省,市,县的轮廓,同时包括南海段线(之前是九段线,2014年改为...
  • 因为网上找到的地图很多都是国外做的,争议领土都在对立面,故7月20号从阿里爬了最新国内地图的数据,基本是现在网上能找到的最新的地图了,包括省,市,县的轮廓,同时包括南海段线(之前是九段线,2014年改为...
  • 南海九段线数据

    千次阅读 多人点赞 2019-12-04 18:12:00
    *正确的国家版图是国家主权领土完整的象征,体现了国家在主权方面的意志在国际社会中的政治、外交立场。*近日,电视剧《亲爱的,热爱的》第39集中存在“问题地图”。 根据*《中华人民共和国测绘法》《地图管理...

    *正确的国家版图是国家主权和领土完整的象征,体现了国家在主权方面的意志和在国际社会中的政治、外交立场。*近日,电视剧《亲爱的,热爱的》第39集中存在“问题地图”。

    根据*《中华人民共和国测绘法》《地图管理条例》《地图审核管理规定》*,自然资源部对电视剧相关内容进行了初步核查,发现该剧存在登载使用的地图未履行地图审核程序,同时该剧登载使用的地图存在错误表示我国藏南地区和阿克赛钦地区国界线、我国台湾岛和海南岛底色与大陆不一致、漏绘我国南海诸岛和南海诸岛归属范围线、克什米尔地区表示不符合国家有关规定等问题。据此,自然资源部已责成属地管理部门对涉嫌违法违规的行为依法进行处理。

    本期数据分享为 南海诸岛及九段线数据。

    在这里插入图片描述

    在这里插入图片描述

    链接:https://pan.baidu.com/s/1oncKrq2BoNPGC2SJSVf9aw
    提取码:qe2s

    展开全文
  • 关于我,十九线程序员小 UP

    千次阅读 多人点赞 2021-05-26 14:20:14
    从编程小白到腾讯,再到 20w 粉知识博主,...我熟悉多种编程语言技术栈,包括但不限于 Java 后端、前端、小程序开发,在校期间就带工作室建设了几个校园网站,以 专业第一 的成绩拿过国家奖学金、挑战杯学术竞赛.

    从编程小白到腾讯,再到 20w 粉知识博主,希望我的经历能帮助到你。

    程序员鱼皮

    98 年生,有野心的天蝎座,20 届本科毕业加入 腾讯,从事全栈应用开发,同时也是 腾讯云开发高级布道师

    我热爱学习和分享编程技术,在公众号、抖音、B 站、知乎、GitHub 等多个平台创作(都叫 “程序员鱼皮”),全网累计收获近 20w 粉丝的关注。

    我熟悉多种编程语言和技术栈,包括但不限于 Java 后端、前端、小程序开发,在校期间就带工作室建设了几十个校园网站,以 专业第一 的成绩拿过国家奖学金、挑战杯学术竞赛国奖、上海市优秀毕业生,出版过区块链教材,也曾有过字节跳动、腾讯等三家公司的实习经历,甚至还有段创业经历,并成功积分落户上海。

    此外,我独立开发了【编程导航】全栈项目,已经帮助上万名小伙伴找到优质编程学习资源!

    编程导航,发现优质编程资源

    知识分享

    我知道自学编程这条路充满艰辛,因此致力知识分享,短短几个月,在 个人公众号(程序员鱼皮) 原创 89 篇文章、60 多个视频,包括进大厂的学习经验、提高编程效率的技巧、技术干货、有趣的实战项目、大厂工作日记、编程避坑指南、个人成长感悟等,希望能 帮大家少走弯路

    公众号中,我对原创文章进行了精选和分类,其中几篇文章,单篇转载量就接近 30 次,阅读后的小伙伴收获满满。

    微信扫码或搜索,即可关注:程序员鱼皮

    关注后回复【资源】,还有鱼皮为大家 精心准备 的 6T 全套学习资料~

    最后再送大家 帮助我拿到大厂 offer 的学习资源 ,比如这份精美的【谷歌大佬算法刷题笔记】(提取码:qfx8):

    谷歌大佬总结的算法刷题指南,助你搞定程序员面试

    还有全套视频教程 + 习题 + 答案 + 源码、可在线使用的编程导航、上千本编程书籍、几百份大厂面经、实战项目等,高达 6 T

    跑了,留下 6T 的资源!


    我的成长

    我在公众号中分享自己:从 0 自学进入腾讯 的编程学习、实习、求职、考证、写书经历,希望帮助大家少走弯路、不再迷茫!

    帮助很多小伙伴找到了学习目标和方向,也希望能帮助到你。


    共勉

    相信自己有能力,那么你就真的会有!

    展开全文
  • 一场典型的英雄联盟游戏通常需要持续30到45分钟,并且每个游戏可以分为三个阶段:对线阶段,中期后期。 玩家通常会花前10到15分钟在自己的分路(上,中,下,JG)中进行发育,以尽早获得装备等级上的优势。 在...

    使用来自大约10K游戏的前10分钟数据来预测高elo排名游戏的结果

    介绍

    《英雄联盟》是一款以团队为基础的战略游戏,两支拥有五名强大召唤师的队伍将面在峡谷中进行对决,而团队的目标是拆掉对方的基地。

    一场典型的英雄联盟游戏通常需要持续30到45分钟,并且每个游戏可以分为三个阶段:对线阶段,中期和后期。 玩家通常会花前10到15分钟在自己的分路(上,中,下,JG)中进行发育,以尽早获得装备和等级上的优势。 在游戏的中期阶段,玩家开始专注于宏观层面:推线,拆塔,获取地图目标(男爵,小龙)以及进行区域的小团战。 在后期游戏中,如果游戏尚未结束,则每个团队都必须决定如何结束游戏,例如:压制男爵/长老龙或1-4分推等。

    在此项目中,我使用了Kaggle收集的名为“ michel’s fanboi”的数据,数据集包含前10分钟。 大约统计 从高ELO(钻石I到大师)的10k排名游戏(SOLO QUEUE)。 可以在此处找到完整的描述和数据源(https://www.kaggle.com/bobbyscience/league-of-legends-diamond-ranked-games-10-min)

    每个团队的英雄组合将对游戏结果有着至关重要的影响,因为有些英雄在游戏早期很强大,而其他英雄将在游戏中后期大幅增长。这就是为什么所有的排名游戏和职业游戏在比赛前都会有一个ban/pick阶段。然而,玩家通过技能和地图意识对游戏产生的影响并不会在英雄组合技能衔接中体现出来。特别是一些玩家,比如RNG。无论对手是否有反挡拆,Uzi在对线阶段都可以获得明显的优势。

    同时,我们可以看到,在很多高级游戏,团队组合,特别是游戏后期的组合,在对线阶段会出现更多的不确定性,如一个团队如果能在对线获取非常大的的优势,那么对手即便是后期的英雄,有时候也会输掉比赛。我的目标是了解兑现阶段的表现(前10分钟)是如何影响最终结果的。

    我使用Jupyter笔记本和R studio作为代码编辑器。我使用Pandas、NumPy和Matlibplot包进行了一些数据探索。然后,我实现了9个模型,包括集成模型、叠加模型和其他7个分类器。一致性最高的模型为叠加模型,其交叉验证的平均正确率为0.732158,标准差为+/- 0.005171。

    数据探索

    数据集共有9879场比赛的信息,其中蓝队获胜4930场,占49.9%。这是一个非常平衡的数据集。

    图1显示了两个团队的死亡人数。紫分表示红队获胜,黄分表示蓝队获胜。我了解到蓝队在前10分钟杀死超过15人后赢得了所有的比赛。蓝队的胜率在戏剧性地杀死7人之后开始上升。

    图1

    图2显示了两支球队的助攻次数。这与杀戮情节有着相同的模式。然而,在对线阶段,每支队伍只有一场比赛可以杀死20个以上,而在对线阶段,有许多比赛双方都能得到20次以上的助攻。这表明,大多数的杀戮可能来自下路,或者是打野gank了很多次。

    图2 助攻

    图3显示了获取金钱数的比较。这张图给了我一个明显的暗示,如果蓝队能在前10分钟内获得2万枚以上的金牌,他们就极有可能赢得比赛。我还手动设置了一个“绿色区域”,即蓝色团队在前10分钟内获得超过21,055枚金牌的游戏。在这个数据样本中,蓝色队伍赢得了所有落在“绿色区域”的比赛。

    图3 玩家金币

    然后,我研究了蓝队在对线阶段取得的金币差异与比赛结果之间的关系。图4显示,当蓝队在前10分钟(红区)的金币差距在-6324和6744之间时,比赛非常不稳定,最终结果可能对任何一方有利。

    图4 团队金币

    在《英雄联盟》的游戏中,在游戏中后期拥有更好视野的团队更容易获得主动权。然而,在游戏早期,视野有多重要?图5并没有显示出视觉在早期游戏中的重要性,这有点超出了我的预期。

    图5 视野

    图6显示了蓝队在对线阶段的经验差异与比赛结果之间的关系。当游戏在前10分钟的经验差大约是+/- 5000 XP时,游戏实际上是50-50。在一个普通的框架游戏中,中路和上路可以在大约10分钟内的差距可以达到8级,下路和打野可以分别达到6级。从7级到8级需要1150 XP,从5级到6级需要880 XP。5000经验优势意味着在早期游戏中,每条通道平均会提高至少1级(1150*2+880*3=4940)。

    图6 经验差距

    除此之外,我还发现了一些有趣的统计数据:

    1. 当蓝队的KDA在前10分钟大于或等于3时,他们有76.51%的胜率。
    2. 当蓝队能够在前10分钟内摧毁一座塔时,他们的胜率为75.43%。
    3. 当蓝队在前10分钟杀死8个人时,他们有69.86%的胜率。

    工程特性

    因为游戏中有许多价值较大的功能,如经验,总金币等。我对这些特性应用了StandardScaler()和MinMaxScaler()。在测试之后,我决定对项目的其余部分使用StandardScaler()转换。

    我还创建了以下功能:

    blueKDA/redKDA:蓝队在前10分钟内的杀死比。它是由[(blueKills+blueAssists)/blueDeaths]计算的。我也使用了相同的过程来创建redKDA。

    KDADiff:两队之间的KDA差。计算方法为[blueKDA-redKDA]。

    blueGoldAdv:这个特性是一个二元变量。它表示蓝队在比赛开始的10分钟内是否至少有20000枚金币的优势。

    blueDiffNeg:这个特性是一个二元变量。它表示蓝队在比赛开始前10分钟的金牌差距是否小于或等于-6324。

    blueDiffPos:这个特性是一个二元变量。它表示蓝队在比赛开始前10分钟的金牌差距是否大于或等于6744。

    建模

    因为实际上没有设置检验标准模型有效性的工具,所以这里选择使用交叉验证技术,并使用准确性和ROC作为评估指标。

    我测试了以下9种模型:

    AdaBoostClassifier, CatBoostClassifier, XGBoostClassifier, Support Vector Classifier, LogisticRegression, RandomForestClassifier, KNeighborsClassifier,EnsembleVoteClassifier, StackingClassifier

    eclf = EnsembleVoteClassifier(clfs=[cat,logreg, knn, svc,ada,rdf,xgb], weights=[1,1,1,1,1,1,1])
    
    labels = ['CatBoost','Logistic Regression', 'KNN', 'SVC','AdaBoost',"Random Forest",'XGBoost','Ensemble']
    
    cv=KFold(n_splits = 5, random_state=2022,shuffle=True)
    
    for clf, label in zip([cat,logreg, knn, svc, ada, rdf, xgb,eclf], labels):
    	scores = cross_val_score(clf, info_x, info_y, 
                                 cv=cv, 
                                 scoring='accuracy',
                                 n_jobs=-1)    
        print("[%s] Accuracy: %0.6f (+/- %0.6f) Best: %0.6f " % (label,scores.mean(), scores.std(), scores.max()))
    

    图7显示了这九个模型的输出。 经过超参数调整后,堆叠模型的平均准确度为0.732158,为第三佳得分。 尽管如此,它的标准偏差也最低,表明它在防止交叉验证测试中过拟合方面表现最佳。 集成模型和堆叠模型的ROC得分也最高和第二。

    图7
    plt.figure()
    lw = 1#knn
    knn.fit(X_train,y_train)
    knn_pred = knn.predict_proba(X_test)
    fpr, tpr, threshold = roc_curve(y_test,knn_pred[:,1])
    roc_auc = auc(fpr, tpr)
    plt.plot(fpr, tpr, color='tab:blue',
                 lw=lw, label='KNN ROC curve (area = %0.4f)' % roc_auc)
    ... ...
    
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
    plt.xlim([-0.02, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('ROC curve')
    plt.legend(loc="lower right")
    plt.show()
    

    图8是我上面提到的所有模型的ROC图:

    图8

    错误预测分析

    在该项目结束时,我将数据集按7:3的比例分为训练和测试数据集,并使用堆叠模型对训练数据集进行拟合。 然后,我对模型错误预测的实例进行了更多分析。 我想了解,在什么样的条件下游戏将变得更加不可预测。

    图9和图10展示了两个团队在前10分钟的总金牌和总经验。 这两幅图清楚地表明,拥有早期金牌优势和经验的球队最终输掉了比赛。 测试集中有799个错误的预测。

    我也更进一步研究了打野的表现,因为在对战游戏中,两个团队的上路者通常都需要打野的帮助才能获得主动权。 图11显示了打野的表现。 这是整个测试数据集,错误的预测和正确的预测分别在“ blueTotalJungleMinionsKilled”和“ redTotalJungleMinionsKilled”之间的平均差异。 错误预测的“ JGDiff”小于整个测试数据集的平均水平,这意味着当蓝色打野的表现超出平均水平时,预测会变得更加困难。

    结论

    我的模型显然遇到了瓶颈,因为它们均无法产生高于0.75的准确性得分。我的假设是最终数据集仅包含44个要素,这是一个非常低维的数据集,因为《英雄联盟》可能从每场游戏中捕获数百个变量。对于进一步的实验,可以将诸如英雄组合,时间范围,特定玩家的冠军熟练度等功能纳入分析。

    英雄联盟是过去十年来全球最受欢迎的游戏之一。它召集了来自不同地区的玩家,让他们在召唤师峡谷中分享快乐。即使我试图预测排名游戏的结果,但我始终理解,保持游戏魅力的唯一方法就是使其尽可能不可预测。最激动人心的时刻总是伴随着巨大的复出而进行的终极小组战斗。

    最后所有的代码都在这里:https://github.com/jinhangjiang/LOLAnalysis-10mins

    作者:Jinhang Jiang

    deephub翻译组

    展开全文
  • MPAndroidChart项目实战()——自定义带文字分段堆积柱状图   一丶先看效果图   Gif图大小限制,效果不是很清晰,高清效果是特别帅的 二丶先说一下功能点 1.双折线图(平滑曲线),展现对比效果 2.X轴单位,...

    Demo补充中(UpDating):https://github.com/JinBoy23520/MPAndroidChartDemoByJin

    本文出自:http://blog.csdn.net/dt235201314/article/details/54135182

    MPAndroidChart常见设置属性(一)——应用层  
    MPAndroidChart项目实战(一)——实现对比性柱状图  
    MPAndroidChart项目实战(二)——双平滑曲线(双折线图)和MarkView实现  
    MPAndroidChart项目实战(三)——饼状图实现和文字重合问题解决  
    MPAndroidChart项目实战(四)——柱状图实现及X轴文字不显示问题和柱状图上显示文字  
    MPAndroidChart X轴文字斜着显示  
    MPAndroidChart项目实战(五)——组合图实现趋势图  
    MPAndroidChart项目实战(六)——自定义1MPAndroidChart滑动冲突解决(搞不定产品设计师就只能搞自己)  
    MPAndroidChart项目实战(七)——自定义横向柱状图  
    MPAndroidChart项目实战(八)——自定义分段堆积柱状图  
    MPAndroidChart项目实战(九)——自定义带文字分段堆积柱状图  

    一丶先看效果图

                     

    Gif图大小限制,效果不是很清晰,高清效果是特别帅的

    二丶先说一下功能点

    1.双折线图(平滑曲线),展现对比效果

    2.X轴单位,默认显示在1(月)

    3.Y轴单位(%)或者其他,但文字写上去总是有点丑,就没放在Y轴

    4.MarkView这里的不同点在于,点击一个点显示相同X轴对比的数据

    5.新版MPAndroidChart支持两条折现X长度不一样,就是有一条为null就只显示另一条,当长度不一同样可以显示,老版本(jar包版本)就不行。

    6.解决MPAndroidChart在ViewPage+fragment里的滑动冲突

    三丶看代码

    MPAndroidChart库的导入与基本属性:(参考刘某人MPAndroidChart专栏),写得很详细(自己想写的但又落在别人后面,又少了增粉蹭浏览量的好机会)

    MPAndroidChart常见设置属性(一)——应用层

    Android图表库MPAndroidChart(十四)——在ListView种使用相同的图表

    1.项目复用率很高,先得有个BaseChartEntry.Java

    public abstract class BaseChartEntity<T extends Entry> {
    
        protected BarLineChartBase mChart;
    
        protected List<T>[] mEntries;
        protected String[] labels;
        protected int []mChartColors;
        protected float mTextSize;
        protected int mValueColor;
        protected BaseChartEntity(BarLineChartBase chart, List<T> []entries, String[] labels,
                                  int []chartColor, int valueColor, float textSize) {
            this.mChart = chart;
            this.mEntries = entries;
            this.labels = labels;
            this.mValueColor = valueColor;
            this.mChartColors = chartColor;
    //        this.mTextSize = textSize;
            this.mTextSize = 11f;
            initChart();
        }
    
        /**
         * <p>初始化chart</p>
         */
        protected void initChart() {
            initProperties();
            setChartData();
            initLegend(Legend.LegendForm.LINE, mTextSize, mValueColor);
            initXAxis(mValueColor, mTextSize);
            initLeftAxis(mValueColor, mTextSize);
        }
    
    
        private void initLeftAxis(int color, float textSize) {
            YAxis leftAxis = mChart.getAxisLeft();
            leftAxis.setTextColor(color);
            leftAxis.setTextSize(textSize);
            float yMax = mChart.getData().getYMax() == 0 ? 100f : mChart.getData().getYMax();
            leftAxis.setAxisMaximum(yMax + yMax * 0.007f);
    //        leftAxis.setAxisMinimum(0f);
            leftAxis.setDrawGridLines(false);
            leftAxis.setGranularityEnabled(false);
            leftAxis.setDrawZeroLine(false);
            leftAxis.setLabelCount(6);
            leftAxis.setAxisLineWidth(1f);
            leftAxis.setAxisLineColor(mValueColor);
    
            mChart.getAxisRight().setEnabled(false);
    
        }
    
        private void initXAxis(int color, float textSize) {
            XAxis xAxis = mChart.getXAxis();
            xAxis.setTextSize(textSize);
            xAxis.setAxisMinimum(0);
            xAxis.setTextColor(color);
            xAxis.setDrawGridLines(false);
            xAxis.setDrawAxisLine(true);
            xAxis.setDrawLabels(true);
            xAxis.setAxisLineWidth(1f);
            xAxis.setLabelCount(8);
            xAxis.setDrawLimitLinesBehindData(true);
            xAxis.setAxisLineColor(mValueColor);
            xAxis.setCenterAxisLabels(false);
            xAxis.setAxisMinimum(mChart.getData().getXMin());
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        }
    
        /**
         * <p>初始化属性信息</p>
         */
        private void initProperties() {
            mChart.setNoDataText("");
            // no description text
            mChart.getDescription().setEnabled(false);
            // enable touch gestures
            mChart.setTouchEnabled(true);
            mChart.setDragDecelerationFrictionCoef(0.9f);
            // enable scaling and dragging
            mChart.setDragEnabled(true);
            mChart.setScaleXEnabled(true);
            mChart.setPinchZoom(false);
            mChart.setVisibleXRangeMaximum(6);
            mChart.setScaleYEnabled(false);
            mChart.setDrawGridBackground(false);
            mChart.setHighlightPerDragEnabled(false);
            // if disabled, scaling can be done on x- and y-axis separately
            mChart.setPinchZoom(false);
        }
    
        /**
         * <p>初始化Legend展示信息</p>
         * @param form 样式
         * @param legendTextSize 文字大小
         * @param legendColor 颜色值
         */
        public void initLegend(Legend.LegendForm form, float legendTextSize, int legendColor) {
            // get the legend (only possible after setting data)
            Legend l = mChart.getLegend();
            // modify the legend ...
            l.setForm(form);
            l.setTextSize(legendTextSize);
            l.setTextColor(legendColor);
            //l.setYOffset(11f);
            updateLegendOrientation(Legend.LegendVerticalAlignment.BOTTOM, Legend.LegendHorizontalAlignment.RIGHT, Legend.LegendOrientation.HORIZONTAL);
        }
    
        /**
         * <p>图例说明</p>
         * @param vertical 垂直方向位置 默认底部
         * @param horizontal 水平方向位置 默认右边
         * @param orientation 显示方向 默认水平展示
         */
    
        public void updateLegendOrientation (Legend.LegendVerticalAlignment vertical, Legend.LegendHorizontalAlignment horizontal, Legend.LegendOrientation orientation) {
            Legend l = mChart.getLegend();
            l.setVerticalAlignment(vertical);
            l.setHorizontalAlignment(horizontal);
            l.setOrientation(orientation);
            l.setDrawInside(false);
    
        }
    
        /**
         * 图表value显示开关
         */
        public void toggleChartValue () {
            List<BaseDataSet> sets = mChart.getData().getDataSets();
            for (BaseDataSet iSet : sets) {
                iSet.setDrawValues(!iSet.isDrawValuesEnabled());
            }
            mChart.invalidate();
        }
    
        public void setMarkView (MarkerView markView) {
            markView.setChartView(mChart); // For bounds control
            mChart.setMarker(markView); // Set the marker to the chart
            mChart.invalidate();
        }
    
        /**
         * x/ylabel显示样式
         * @param xvalueFromatter x
         * @param leftValueFromatter y
         */
        public void setAxisFormatter(IAxisValueFormatter xvalueFromatter, IAxisValueFormatter leftValueFromatter) {
            mChart.getXAxis().setValueFormatter(xvalueFromatter);
            mChart.getAxisLeft().setValueFormatter(leftValueFromatter);
            mChart.invalidate();
    
        }
    
        protected abstract void setChartData();
    
    
        /**
         * value显示格式设置
         * @param valueFormatter IValueFormatter
         */
        public void setDataValueFormatter(IValueFormatter valueFormatter) {
            mChart.getData().setValueFormatter(valueFormatter);
        }
    }
    这里设置了一些简单属性和方法类似setMarkView等,方便统一使用。需要修改时重写方法修改就行。


    2.下面这个类就厉害了,基本是根据设计图样式添加的一些属性方法(对应图表一的基本属性),同样修要修改时重写方法就可以哒

    public class LineChartEntity extends BaseChartEntity<Entry> {
    
        public LineChartEntity (LineChart lineChart, List<Entry> []entries, String[] labels,
                                 int []chartColor, int valueColor, float textSize) {
            super(lineChart, entries, labels, chartColor, valueColor, textSize);
        }
    
    
        @Override
        protected void initChart() {
            super.initChart();
            mChart.getAxisLeft().setDrawGridLines(true);
            mChart.getAxisLeft().enableGridDashedLine(10f, 15f, 0f);
            mChart.getAxisLeft().setGridLineWidth(0.5f);
            mChart.getAxisLeft().setGridColor(Color.parseColor("#f5f5f5"));
            mChart.getAxisLeft().setDrawZeroLine(false);
            mChart.getAxisRight().setDrawZeroLine(false);
            mChart.getAxisRight().setZeroLineWidth(0f);
            mChart.getAxisLeft().setZeroLineWidth(0f);
            mChart.getAxisLeft().setDrawAxisLine(false);
            mChart.getXAxis().setDrawAxisLine(false);
    //        mChart.setScaleMinima(1.38f, 1f);
    //        mChart.getXAxis().setDrawGridLines(true);
    //        mChart.getXAxis().enableGridDashedLine(20f, 20f, 0f);
        }
    
        @Override
        protected void setChartData() {
            LineDataSet []lineDataSet = new LineDataSet[mEntries.length];
                if (mChart.getData() != null && mChart.getData().getDataSetCount() == mEntries.length) {
                    for(int index = 0, len = mEntries.length; index < len; index ++) {
                        List<Entry> list = mEntries[index];
                        lineDataSet[index] = (LineDataSet) mChart.getData().getDataSetByIndex(index);
                        lineDataSet[index].setValues(list);
                    }
                    mChart.getData().notifyDataChanged();
                    mChart.notifyDataSetChanged();
                }  else {
                    for (int index = 0, len = mEntries.length; index < len; index ++) {
                        lineDataSet[index] = new LineDataSet(mEntries[index], labels[index]);
                        lineDataSet[index].setAxisDependency(YAxis.AxisDependency.LEFT);
                        lineDataSet[index].setColor(mChartColors[index]);
                        lineDataSet[index].setLineWidth(1.5f);
                        lineDataSet[index].setCircleRadius(3.5f);
                        lineDataSet[index].setCircleColor(mChartColors[index]);
                        lineDataSet[index].setFillAlpha(25);
    //                    lineDataSet[index].enableDashedLine(10f, 15f, 0f);
    //                    lineDataSet[index].enableDashedHighlightLine(10f, 15f, 0f);
                        lineDataSet[index].setDrawCircleHole(false);
                        lineDataSet[index].setValueTextColor(mChartColors[index]);
    //                    lineDataSet[index].setFillColor(ColorTemplate.colorWithAlpha(Color.YELLOW, 200));
    
                    }
                    // create a data object with the datasets
                    LineData data = new LineData(lineDataSet);
                    data.setValueTextSize(mTextSize);
    
                    // set data
                    mChart.setData(data);
                    mChart.animateX(2000, Easing.EasingOption.EaseInOutQuad);
            }
    
        }
    
    
        /**
         * <p>填充曲线以下区域</p>
         * @param drawable 填充drawable
         * @param filledColor 填充颜色值
         * @param fill true:填充
         */
        public void toggleFilled(Drawable []drawable, int []filledColor, boolean fill) {
            List<ILineDataSet> sets = ((LineChart)mChart).getData().getDataSets();
    
            for (int index = 0, len = sets.size(); index < len; index ++ ) {
                LineDataSet set = (LineDataSet) sets.get(index);
                if (drawable != null) {
                    set.setFillDrawable(drawable[index]);
                } else if (filledColor != null){
                    set.setFillColor(filledColor[index]);
                }
                set.setDrawFilled(fill);
            }
            mChart.invalidate();
        }
    
        /**
         * <p>绘制曲线上点</p>
         * @param draw true:绘制
         */
        public void drawCircle ( boolean draw) {
            List<ILineDataSet> sets = ((LineChart)mChart).getData().getDataSets();
            for (ILineDataSet iSet : sets) {
                LineDataSet set = (LineDataSet) iSet;
                set.setDrawCircles(draw);
            }
            mChart.invalidate();
        }
    
        /**
         * 设置图表颜色值
         * @param mode LineDataSet.Mode
         */
        public void setLineMode (LineDataSet.Mode mode) {
            List<ILineDataSet> sets = ((LineChart)mChart).getData().getDataSets();
            for (ILineDataSet iSet : sets) {
                LineDataSet set = (LineDataSet) iSet;
                set.setMode(mode);
            }
            mChart.invalidate();
        }
    
        public void setEnableDashedLine (boolean enable) {
            List<ILineDataSet> sets = ((LineChart)mChart).getData().getDataSets();
            for (ILineDataSet iSet : sets) {
                LineDataSet set = (LineDataSet) iSet;
                if (enable) {
                    set.disableDashedLine();
                } else {
    //                set.setFormLineWidth(1f);
    //                set.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f));
    //                set.setFormSize(15.f);
                    set.enableDashedLine(10f, 5f, 0f);
                    set.enableDashedHighlightLine(10f, 5f, 0f);
                }
            }
            mChart.invalidate();
    
        }
    
        /**设置x缩放的最小最大值*/
        public void setMinMaxScaleX(float minScaleX, float maxScaleX) {
            mChart.getViewPortHandler().setMinMaxScaleX(minScaleX, maxScaleX);
        }
    }
    
    每个方法上都有所标注,功能方法填充背景啊,绘制动画啊,折现类型啊,缩放最大值最小值啊等

    说一下这个最大值最小值,当图标控件宽设为martch,那么1就是屏幕宽度,1.5就是1.5个屏幕宽度

    当都设为同一个值时是就是不允许缩放,大于1可滑动,都等于1就是不可缩放不可滑动


    3.V层应用重要方法

    public void updateLineData (LineChart mChart ) {
        List<ILineDataSet> sets = mChart.getData().getDataSets();
        for (ILineDataSet iSet : sets) {
            LineDataSet set = (LineDataSet) iSet;
            set.setFillAlpha(255);
            set.setDrawCircleHole(true);
        }
        mChart.getAxisLeft().setDrawGridLines(true);
        mChart.getAxisLeft().enableGridDashedLine(10f, 0f, 0f);
        mChart.getAxisLeft().setGridLineWidth(0.5f);
        mChart.getAxisLeft().setGridColor(Color.parseColor("#f5f5f5"));
        mChart.getXAxis().setDrawGridLines(true);
        mChart.getXAxis().enableGridDashedLine(10f, 0f, 0f);
        mChart.getXAxis().setGridLineWidth(0.5f);
        mChart.getXAxis().setGridColor(Color.parseColor("#f5f5f5"));
        mChart.invalidate();
    }
    这个方法就是重写折线图样式,相对于GIF图二,这里将圆点改为空心,填充背景透明度改为255最大就是没有

    然后就是绘制X和Y轴网格,enableGridLines属性本来是绘制虚线属性,当后面两位都为0时就成了实线


    好现在上最重要的方法(传入双折线图数值,线色,背景填充,X轴,Y轴样式,MarkView展现)

     private void updateLinehart(final List<FansMonthListEntity> fansMonthList, LineChart lineChart, int[] colors, Drawable[] drawables, final String unit, List<Entry> values1, List<Entry> values2, final String[] labels) {
            List<Entry>[] entries = new ArrayList[2];
            entries[0] = values1;
            entries[1] = values2;
            LineChartEntity lineChartEntity = new LineChartEntity(lineChart, entries, labels, colors, Color.parseColor("#999999"), 12f);
            lineChartEntity.drawCircle(true);
            lineChart.setScaleMinima(1.0f, 1.0f);
    //        toggleFilled(lineChartEntity, drawables, colors);
            lineChartEntity.setLineMode(LineDataSet.Mode.LINEAR);
            lineChartEntity.initLegend(Legend.LegendForm.CIRCLE, 12f, Color.parseColor("#999999"));
            lineChartEntity.updateLegendOrientation(Legend.LegendVerticalAlignment.TOP, Legend.LegendHorizontalAlignment.RIGHT, Legend.LegendOrientation.HORIZONTAL);
            lineChartEntity.setAxisFormatter(
                    new IAxisValueFormatter() {
                        @Override
                        public String getFormattedValue(float value, AxisBase axis) {
                            if (value == 1.0f) {
                                return mFormat.format(value) + mContext.getResources().getString(R.string.line_x_unit_month);
                            }
                            String monthStr = mFormat.format(value);
                            if (monthStr.contains(".")) {
                                return "";
                            } else {
                                return monthStr;
                            }
    //                        return mMonthFormat.format(value);
                        }
                    },
                    new IAxisValueFormatter() {
                        @Override
                        public String getFormattedValue(float value, AxisBase axis) {
                            return mFormat.format(value) + unit;
                        }
                    });
    
            lineChartEntity.setDataValueFormatter(new IValueFormatter() {
                @Override
                public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) {
                    return mFormat.format(value) + unit;
                }
            });
    
            final NewMarkerView markerView = new NewMarkerView(mContext, R.layout.custom_marker_view_layout);
            markerView.setCallBack(new NewMarkerView.CallBack() {
                @Override
                public void onCallBack(float x, String value) {
                    int index = (int) (x);
                    if (index < 0) {
                        return;
                    }
                    if (index > fansMonthList.size()) {
                        return;
                    }
                    String textTemp = "";
                    String monthUnit = mContext.getResources().getString(R.string.home_text_month);
                    if (index <= fansMonthList.size()) {
    
                        textTemp += labels[0] + "(" + index + monthUnit +  ")" + ":" + mFormat.format(Float.parseFloat(fansMonthList.get(index - 1).getFansNum())) + unit;
                        textTemp += "\n";
                        textTemp += labels[1] + "(" + index + monthUnit +  ")" +  ":" + mFormat.format(Float.parseFloat(fansMonthList.get(index - 1).getFansRealNum())) + unit;
                    }
    
                    markerView.getTvContent().setText(textTemp);
                }
            });
            lineChartEntity.setMarkView(markerView);
            lineChart.getData().setDrawValues(false);
        }

    好,重要的代码都展现在这里。


    不好意思贴掉了一个类NewMarkerView详情见博客:

    MPAndroidChart项目实战——MarkerView显示问题解决


    最后谈一谈开发时遇到的一些bug

    1.lineChart滑动冲突

    参考:MPAndroidChart在ViewPager+Fragment滑动冲突解决

    2.当数据都为0时,X轴成一条直线,有时还出现负数,Y轴被压缩,文字重复显示,特别丑

    mChart.getAxisLeft().setAxisMinimum(0);
    mChart.getAxisLeft().setAxisMaximum((float) (mChart.getData().getYMax() *1.1 + 20));
    解决方法设置Y轴最小值为0,最大值为获得的最大值得1.1倍加20

    这样既不会出现负数Y轴数值也不会压缩在一起

    3.日月图表切换时,月表无辜变特别长,日X轴30~31个点,月12个点

    解决方法:日月切换时重新设定缩放倍数

    linechart.getViewPortHandler().setMinMaxScaleX(2,2);
    4.markview,这个是真难,代码如上,但是大神帮忙解决的


    总结:

    MPAndroidChart是很好的开源库,新老版本改变差别较大,各有利弊。但jar包版(老版本)和新版本能共存,可解决很多问题

    当开源库不能达到需求时,就要修改开源库,这个对于目前的我太难了,而同事能做到,这方便要加强,对开源源码的解读要加强

    文章写到这里希望对大家能有帮助,不懂的地方直接评论问,另外,文章画了不少时间希望能成为我的第一篇技术文章,希望大家支持


    五丶跪求关注下载源码,200粉小目标
    欢迎关注我的博客及微信公众号,后面会给大家带来更多相关MPAndroidChart无法解决的仿MPAndroidChart图标自定义控件
    源码下载记得顺便Star哦~
    下载链接:https://github.com/JinBoy23520/MPAndroidChartDemoByJin

    写在最后微信扫码提问


    展开全文
  • 接上文 计算机图形学 学习笔记():曲线曲面(一):参数曲线、参数几何代数形式7.5 Bezier 曲线背景及定义Bezier 曲线背景给定 n+1个数据点,p0 ( x0 , y0 ) … pn ( xn , yn ),生成一条曲线,使得该曲线与这些...
  • turtle 第四章 数值日期时间处理 第五章 字符串文本处理 第六章 文件数据交换 第七章 数据访问 第八章 网络编程通信 第十九章 并行计算:进程、线程协程 第二章 系统管理 第一章 Python概述 ...
  • 小甲鱼零基础入门学习python笔记

    万次阅读 多人点赞 2019-08-14 11:06:30
    目录: 000 愉快的开始 001 我Python的第一次亲密接触 002 用Python设计第一个游戏 003 小插曲之变量字符串 004 改进我们的小游戏 005 闲聊之Python的数据类型 006 Pyhon之常用操作符 007 了不起的分支循环 ...
  • 十九、数据整理(上) 作者:Chris Albon 译者:飞龙 协议:CC BY-NC-SA 4.0 在 Pandas 中通过分组应用函数 import pandas as pd # 创建示例数据帧 data = {'Platoon': ['A','A','A','A','A','A','B','B','B','B'...
  • 中信银行总行信息科技部今年在...一、 校招时间线 网申(11月初截止)+ 行测 宣讲会+提前批面试 10月14日 笔试(11月7日) 邮件通知实习(11月28日),正式批的同学大概也是这两天发的面试通知。 实习(2019年12月...
  • matlab人脸识别论文

    万次阅读 多人点赞 2019-10-11 17:41:51
    进入九十年代,由于各方面对人脸识别系统的迫切需求,人臉识别的研究变的非常热门。人脸识别的方法有了重大突破,进入了真正的机器自动识别阶段,如Kartbunen-Loeve变换等或新的神经网络技术。人脸识别研究 得到了...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    前端面试题汇总 一、HTMLCSS 21 你做的页面在哪些流览器测试过?...它Standards模式有什么区别 21 div+css的布局较table布局有什么优点? 22 img的alt与title有何异同? strong与em的异同? 22 你能...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    CMM与CMMI的区别 23 第五章 SQL 24 约束: 29 1主键约束 29 2 非空约束 not null 30 3 外键约束 FOREIGN KEY 30 4 默认约束 31 5 检查约束 check 31 6 唯一约束 unique 32 SQL语句 32 创建数据库. 32 表、字段、...
  • ARM7的三级流水线过程

    千次阅读 2017-08-29 12:16:42
    看到汇编中很多关于程序返回与中断返回时处理地址都很特别,仔细想想原来是流水线作用的效果。所以,决定总结学习下ARM流水线。 ARM7处理器采用3级流水线来增加...比如0.9MIPS,表示每秒九十万条指令。 MIPS/MHz表示
  • 线又称阴阳线或阴阳烛,它能将每一个交易期间的开盘与收盘的涨跌以实体的阴阳线表现出来,并将交易中曾出现的最高价及最低价以上影线和下影线的形式直观地反映出来。从而对变化多端的市场行情有一种一目了然的直接...
  • FPGA现状

    万次阅读 多人点赞 2019-07-16 19:51:42
     FPGA技术门槛非常高,核心技术只掌握在及其少数的公司手上,而且xilinxatlera手头握有6000多项专利,对后进者形成很高的技术壁垒,国内厂商要么国外巨头专利交叉授权,要么花钱买专利,但当前我们并没有多少...
  • 一个屌丝程序猿的人生(八十九

    千次阅读 多人点赞 2019-05-29 22:25:36
     王立新停下了手中的筷子,扶了扶眼镜说道:“我还在咱们培训机构的宿舍住呢,过时间我也得找个房子租。”  “培训机构的宿舍那么坑,赶紧搬出来吧。那李魁你呢?”林萧边吃边问道。  “我原来也在咱们...
  • ARM的三级流水线结构(一)

    千次阅读 2018-10-10 11:40:58
    看到汇编中很多关于程序返回与中断返回时处理地址都很特别,仔细想想原来是流水线作用的效果。所以,决定总结学习下ARM流水线。 ARM7处理器采用3级流水线来增加处理器指令流的速度,能提供0.9MIPS/MHz的指令处理...
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
  • Altium Designer基础PCB布局布线

    万次阅读 2017-12-26 03:08:51
    在教程内容开始前,先简单介绍一下AD的界面一些常用的设置。了解AD的功能可以起到事半功倍的效果。 AD18的工作面板精简了很多,删去了一部分用途不大的内容,包括快捷新建功能,都被集成到了菜单栏中。比较常用
  • 本篇文章中,我们一起探讨了OpenCV中霍夫变换相关的知识点,以及了解了OpenCV中实现霍夫线变换的HoughLines、HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircles函数的使用方法。此博文一共有四个配套的简短...
  •  前面的示例可以使用简单的矩形和直线进行简化,其空间关系与上面的多边形和线串的空间关系相同:  我们可以使用SQL生成 DE9IM 信息: SELECT ST_Relate( 'LINESTRING(0 0, 2 0)', 'POLYGON((1 -1, 1...
  • 我学炒外汇 第十九篇移动平均线

    千次阅读 2009-06-21 22:35:00
    移动平均线 一条平均线的应用 移动平均线是最近某时间的价格平均数的连线。有简单移动平均,即简单的把价格相加再平均。另外,还有加权平均,这种算法中,以5天平均为例,第五天(最近一天)乘以5,第四天乘以4,...
  • 前一篇文章详细讲解了如何评价神经网络,绘制训练过程中的loss曲线,并结合图像分类案例讲解精确率、召回率F值的计算过程。本篇文章将分享循环神经网络LSTM RNN如何实现回归预测,通过sin曲线拟合实现如下图所示...
  • Android开发笔记(九十九)圆形转盘

    千次阅读 热门讨论 2016-05-11 11:08:21
    圆形转盘的实现思想 圆形转盘的运用场景常见的有:抽奖转盘、圆形菜单列表、热点客户端环状列表等等。对于圆形转盘的编码实现,主要难点除了手势...二、运用Path类Matrix类,对指定文本或图像做旋转操作,此时旋转的
  • 《单片机原理及应用》复习提纲

    万次阅读 多人点赞 2015-12-14 10:42:02
    用来传送信息的一组导线,为CPU其它部件之间提供数据、地址控制信息的传输通道   地址总线:用于传送地址信息。   数据总线:用于传送数据信息。   控制总线:用于传送控制信息。 (6...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 45,134
精华内容 18,053
关键字:

十段线和九段线区别