python結(jié)合G2繪制精美圖形

一兵多、簡(jiǎn)介

G2是阿里巴巴內(nèi)部開(kāi)放的數(shù)據(jù)可視化工具,提供豐富的圖表類(lèi)型橄仆,并且簡(jiǎn)單易上手剩膘,有比較完善的示例代碼。其生成的圖表簡(jiǎn)單漂亮盆顾,而且有JS互動(dòng)顯示怠褐,比較適合報(bào)告和文章插圖。G2的數(shù)據(jù)來(lái)源是json格式數(shù)據(jù)您宪。

G2繪制的圖形

python的pandas庫(kù)比較擅長(zhǎng)對(duì)數(shù)據(jù)處理和分析奈懒,其DataFrame生成json也很方便奠涌。pandas自身集成了matplotlib的繪圖功能,但是繪制的圖形沒(méi)有G2美觀磷杏。

pandas 繪制的圖形

二溜畅、pandas和G2結(jié)合繪圖

繪制流程如下:

  • 1,pandas讀取mysql數(shù)據(jù)庫(kù)
  • 2极祸,pandas對(duì)數(shù)據(jù)加工處理
  • 3达皿,pandas生成json數(shù)據(jù)
  • 4,創(chuàng)建含G2內(nèi)容的html贿肩,嵌入json數(shù)據(jù)
  • 5峦椰,調(diào)整G2參數(shù),并顯示

下面以具體的案例來(lái)說(shuō)明

1汰规,計(jì)算收益率排名前十的專(zhuān)家

a汤功,讀取數(shù)據(jù)

from sqlalchemy import create_engine
import pandas as pd

sql = "select * from strategy order by pct desc"
df = pd.read_sql(sql, engine)

df['pct'] = df['pct'] * 100  #收益率轉(zhuǎn)換為百分比

b,生成json數(shù)據(jù)

數(shù)據(jù)寫(xiě)到top10.json文件中

import json

datas = []
for ix, row in df[:10].iterrows():
    sss = {'name': row['name'], 'pct': float(row['pct'])}
    datas.append(sss)
encodejson = json.dumps(datas, ensure_ascii=False)
f = open('top10.json', 'w')
f.write(encodejson)
f.close()

c溜哮,創(chuàng)建html

http://g2.alipay.com/demo/ 選取一個(gè)圖表模板創(chuàng)建html文件, 這里選取的是雙 Y 軸

*** top10.html ***

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>收益率排名TOP10</title>
    <link rel="stylesheet" type="text/css"  />
    <!--如果不需要jquery ajax 則可以不引入-->
    <script src="https://a.alipayobjects.com/jquery/jquery/1.11.1/jquery.js"></script>
    <script src="https://a.alipayobjects.com/alipay-request/3.0.3/index.js"></script>
    <!-- 引入 G2 腳本 -->
    <script src="https://as.alipayobjects.com/g/datavis/g2/1.2.2/index.js"></script>
  </head>
  <body>
  <div>  </div>
    <div> </div>
    <div> </div>
    <div id="c1"></div>
    <!-- G2 code start -->
    <script>
        $.getJSON('top10.json', function (data) {
              var Frame = G2.Frame;
              var frame = new Frame(data);
              var chart = new G2.Chart({
                id: 'c1',
                width: 500,
                height: 400
              });
              chart.source(frame, {

                'pct': {alias: '年化相對(duì)收益率(%)'},

              });
              // 去除 X 軸標(biāo)題
              chart.axis('name', {
                title: null,
                 labels:{
                      'font-size':'6',
                      'font-weight': 'bold'  //文本粗細(xì)
                  },

              });

              chart.legend(false);// 不顯示圖例
              //chart.coord('rect').transpose();
              chart.interval().position('name*pct').color('name'); // 繪制層疊柱狀圖
              //chart.line().position('name*correct_rate').color('#5ed470').size(2).shape('smooth'); // 繪制曲線圖
              //chart.point().position('name*correct_rate').color('#5ed470'); // 繪制點(diǎn)圖
              chart.render();


                })
    </script>
    <!-- G2 code end -->
  </body>
</html>

top10.html文件和top10.json文件在一個(gè)文件夾內(nèi)滔金。
生成的圖表如下:

2,計(jì)算推薦次數(shù)最多的股票

a茂嗓,讀取數(shù)據(jù)

from sqlalchemy import create_engine
import pandas as pd

sql = "SELECT code FROM stock "
df = pd.read_sql(sql, engine)

b餐茵,數(shù)據(jù)處理

不同的分析師對(duì)一只股票可能有重復(fù)推薦,這就需要統(tǒng)計(jì)每只股票出現(xiàn)的次數(shù)述吸,然后讓總出現(xiàn)次數(shù)從高往低排序忿族。
用到了自然語(yǔ)言處理包nltk的FreqDist詞頻統(tǒng)計(jì)工具。

from nltk import FreqDist

codes = df['code'].get_values()
print "codes ", len(codes)
fdist = FreqDist(codes) #生成詞頻類(lèi)
fdf = pd.DataFrame(fdist.items(), columns=['code', 'count']) #轉(zhuǎn)成DataFrame
fdf.sort(columns='count', ascending=False, inplace=True)  # 排序
print "fdf ", len(fdf)

c蝌矛,生成表格

創(chuàng)建html跟一個(gè)案例比較相似道批,這里我們生成markdown格式的表格。
定義一個(gè)markdown表格創(chuàng)建工具

"""
markdown 工具
"""

def m_create_table(df):
    """
    從pandas的DataFrame生成markdown格式表格
    :param df:
    :return:
    """
    if len(df) == 0:
        return ''

    datas = []
    head = '|'.join(df.columns)
    head = "|" + head + "|"
    datas.append(head)
    datas.append('-|-')
    for ix, row in df.iterrows():
        data = '|'.join(map(lambda x: str(x), row.get_values()))
        data = "|" + data + "|"
        datas.append(data)

    result = '\n'.join(datas)
    # print result
    return result

調(diào)用并打印顯示

makeTable = m_create_table(fdf)
print makeTable

#輸出

|name|code|
|-|-|
|隆基股份|601012|
|美的集團(tuán)|000333|
|貴州茅臺(tái)|600519|
|華策影視|300133|
|國(guó)軒高科|002074|
|網(wǎng)宿科技|300017|
|陽(yáng)光電源|300274|
|滄州明珠|002108|
|老板電器|002508|
|保利地產(chǎn)|600048|

表格如下:

name code
隆基股份 601012
美的集團(tuán) 000333
貴州茅臺(tái) 600519
華策影視 300133
國(guó)軒高科 002074
網(wǎng)宿科技 300017
陽(yáng)光電源 300274
滄州明珠 002108
老板電器 002508
保利地產(chǎn) 600048

3入撒,統(tǒng)計(jì)餅圖

對(duì)于數(shù)據(jù)比較少的html隆豹,可以直接填入數(shù)據(jù)就能創(chuàng)建比較精美的圖表了。
如下茅逮,只需修改data的name和value值璃赡,就能馬上創(chuàng)建一個(gè)動(dòng)態(tài)的餅圖。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>餅圖</title>
    <link rel="stylesheet" type="text/css"  />
    <!--如果不需要jquery ajax 則可以不引入-->
    <script src="https://a.alipayobjects.com/jquery/jquery/1.11.1/jquery.js"></script>
    <script src="https://a.alipayobjects.com/alipay-request/3.0.3/index.js"></script>
    <!-- 引入 G2 腳本 --><script src="https://as.alipayobjects.com/g/datavis/g2/1.2.6/index.js"></script>
  </head>
  <body>
    <div id="c1"></div>
    <!-- G2 code start -->
    <script>
      var data = [
        {name: '買(mǎi)入', value: 17776 },
        {name: '增持', value: 19890},
        {name: '中性', value: 6814},
        {name: '減持',  value: 4986},
        {name: '賣(mài)出', value: 494},
      ];
      var Stat = G2.Stat;
      var chart = new G2.Chart({
        id: 'c1',
        width: 600,
        height: 400
      });
      chart.source(data);
      // 重要:繪制餅圖時(shí)献雅,必須聲明 theta 坐標(biāo)系
      chart.coord('theta', {
        radius: 0.8 // 設(shè)置餅圖的大小
      });
      chart.legend('bottom');
      chart.intervalStack()
        .position(Stat.summary.percent('value'))
        .color('name')
        .label('name*..percent',function(name, percent){
        percent = (percent * 100).toFixed(2) + '%';
        return name + ' ' + percent;
      });
      chart.render();
      // 設(shè)置默認(rèn)選中
      var geom = chart.getGeoms()[0]; // 獲取所有的圖形
      var items = geom.getData(); // 獲取圖形對(duì)應(yīng)的數(shù)據(jù)
      geom.setSelected(items[1]); // 設(shè)置選中
    </script>
    <!-- G2 code end -->
  </body>
</html>
Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碉考,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惩琉,更是在濱河造成了極大的恐慌豆励,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異良蒸,居然都是意外死亡技扼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)嫩痰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剿吻,“玉大人,你說(shuō)我怎么就攤上這事串纺±雎茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵纺棺,是天一觀的道長(zhǎng)榄笙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)祷蝌,這世上最難降的妖魔是什么茅撞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮巨朦,結(jié)果婚禮上米丘,老公的妹妹穿的比我還像新娘。我一直安慰自己糊啡,他們只是感情好拄查,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著棚蓄,像睡著了一般堕扶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上癣疟,一...
    開(kāi)封第一講書(shū)人閱讀 52,793評(píng)論 1 314
  • 那天挣柬,我揣著相機(jī)與錄音,去河邊找鬼睛挚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛急黎,可吹牛的內(nèi)容都是我干的扎狱。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼勃教,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淤击!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起故源,我...
    開(kāi)封第一講書(shū)人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤污抬,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體印机,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矢腻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了射赛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片多柑。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖楣责,靈堂內(nèi)的尸體忽然破棺而出竣灌,到底是詐尸還是另有隱情,我是刑警寧澤秆麸,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布初嘹,位于F島的核電站,受9級(jí)特大地震影響沮趣,放射性物質(zhì)發(fā)生泄漏削樊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一兔毒、第九天 我趴在偏房一處隱蔽的房頂上張望漫贞。 院中可真熱鬧,春花似錦育叁、人聲如沸迅脐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谴蔑。三九已至,卻和暖如春龟梦,著一層夾襖步出監(jiān)牢的瞬間隐锭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工计贰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钦睡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓躁倒,卻偏偏與公主長(zhǎng)得像荞怒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秧秉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容