繪制各種圖,pandas直接生成、常規繪圖


# -*- coding: utf-8 -*-
import time
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
import pandas as pd
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False
#折線圖、柱狀圖,柱狀堆疊圖、面積圖、填圖、餅圖、直方圖、堆疊直方圖、密度圖、散點圖、箱型圖
#line、 bar、   stacked bar、area、fill、pie、hist、stacked hist、kde、scatter、box
#plt.plot(kind='line', ax=None, figsize=None, use_index=True, title=None, grid=None,
#         legend=False, style=None, logx=False, logy=False, loglog=False, xticks=None,
#         yticks=None, xlim=None, ylim=None, rot=None, fontsize=None, colormap=None,
#         table=False, yerr=None, xerr=None, label=None, secondary_y=False, **kwds)
"""
兩種方法生成graph
方法一:pandas,  pd.plot()
1、這種數據會使用索引
2、Series:可以使用kind= ['line','bar','area','no—fill','pie','hist','kde','no-scatter','box']
    因為只有一個,所以不能夠stacked=True
3、DataFrame:可以使用,
            ['line','stacked line','bar','stacked bar','area','stacked area',
             'no-fill','no-stacked fill','pie','stacked pie','hist','stacked hist',
             'kde','stacked kde','scatter','stacked scatter','box','stacked box']
書寫方式可以這樣
series_or_dataframe.plot(kind = 'a_kind')<===>series_or_dataframe.plot.a_kind()
方法二:常規序列
plt.plot(xdata,ydata)
plt.bar()
方法三:使用pandas,這個就是方法1將kind的值提出來
series_or_dataframe.hist
series_or_dataframe.boxplot
"""
"""
只能用一種方法
fill 填圖
和坐標軸填充用fill,axes[0,1].fill()/plt.fill()
兩個函數之間的填充: axes[0,0].fill_between()/plt.fill_between()
scatter 散點圖
plt.scatter需要將橫縱坐標都放進去,plt.scatter() axes[0,1].scatter()
"""
#pandas直接生成圖
def series_graph():
    a = pd.Series(np.random.randint(0, 10, 10))
    a.plot(kind = 'line')
    # kind → line,bar,barh,hist..(折線圖,柱狀圖,柱狀圖-橫...)
    # style → 風格字符串,這里包括了linestyle(-),marker(.),color(g)
    # color → 顏色,有color指定時候,以color顏色為准
    # alpha → 透明度,0-1
    # use_index → 將索引用為刻度標簽,默認為True
    # rot → 旋轉刻度標簽,0-360
    # grid → 顯示網格,一般直接用plt.grid
    # figsize → 圖像大小
    #其他的參數還可以根據基本元素設置,在matplotlib_basic_element_and_argument
    plt.show()
def dataframe_graph():
    # line、 bar、   stacked bar、area、fill、pie、hist、stacked hist、kde、scatter、box
    a = pd.DataFrame(np.random.randint(10,size=(10,4)),columns = [1,1,1,2])
    print(a)
    a.plot(stacked= True,kind = 'pie')
    plt.show()
def series_line_subplot():
    a = pd.Series(np.random.randint(0,10,100))
    print(a)
    b = pd.Series(np.random.randint(10,20,100))
    print(b)
    fig, axes = plt.subplots(2,2)
    axes[0,0].plot(a)
    axes[1,1].plot(b)
    plt.show()
#不使用pandas
def line_subplot():
    a = np.arange(100)
    fig, axes = plt.subplots(2,2)
    axes[0,0].plot(a)
    plt.show()
def dataframe_line_subplot():
    a = pd.DataFrame(np.random.randint(10, size=(10, 4)), columns=['a', 'b', 'c', 'd'])
    print(a)
    b = pd.DataFrame(np.random.randint(10, size=(10, 4)), columns=['a', 'b', 'c', 'd'])
    print(b)
    fig,axes = plt.subplots(2,2)
    axes[0,0].plot(a)
    axes[1,1].plot(b)
    plt.show()
if __name__=='__main__':
    F = 1

    if F == -1:
        series_graph()
        print("""'Series:可以使用kind= ['line','bar(h)','area','no—fill','pie','hist','kde','no-scatter','box']
    因為只有一個,所以不能夠stacked=True'""")
    elif F ==-2:
        dataframe_graph()
        print("""DataFrame:可以使用,
            ['line','stacked line','bar(h)','stacked bar','area','stacked area',
             'no-fill','no-stacked fill','pie','stacked pie','hist','stacked hist',
             'kde','stacked kde','scatter','stacked scatter','box','stacked box']""")

    elif F == 1:       line()
    elif F == 2:       bar()
    elif F == 3:       pie()
    elif F == 4:       hist();print("'series.hist'")
    elif F == 5:       box1()
    elif F == 6:       box2()
    elif F == 11:      fill()
    elif F == 12:      scatter()

 折線圖

#折線圖
def line():
    a = np.arange(100)
    print(a)
    plt.plot(a,a)
    plt.xlabel('我是')
    plt.show()

 

散點圖 def scatter():
    # plt.scatter()散點圖
    # plt.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None,
    # alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)

    plt.figure(figsize=(8, 6))
    x = np.random.randn(1000)
    y = np.random.randn(1000)
    plt.scatter(x, y, marker='.',
                s=np.random.randn(1000) * 100,
                cmap='Reds',
                c=y,
                alpha=0.8, )
    plt.grid()
    # s:散點的大小
    # c:散點的顏色
    # vmin,vmax:亮度設置,標量
    # cmap:colormap
    plt.show()

 

柱狀圖 def bar():
    # 柱狀圖 plt.bar()

    plt.figure(figsize=(10, 4))
    x = np.arange(10)
    y1 = np.random.rand(10)
    y2 = -np.random.rand(10)

    plt.bar(x, y1, width=1, facecolor='yellowgreen', edgecolor='white', yerr=y1 * 0.1)
    plt.bar(x, y2, width=1, facecolor='lightskyblue', edgecolor='white', yerr=y2 * 0.1)
    # x,y參數:x,y值
    # width:寬度比例
    # facecolor柱狀圖里填充的顏色、edgecolor是邊框的顏色
    # left-每個柱x軸左邊界,bottom-每個柱y軸下邊界 → bottom擴展即可化為甘特圖 Gantt Chart
    # align:決定整個bar圖分布,默認left表示默認從左邊界開始繪制,center會將圖繪制在中間位置
    # xerr/yerr :x/y方向誤差

    for i, j in zip(x, y1):
        plt.text(i + 0.3, j - 0.15, '%.2f' % j, color='white')
    for i, j in zip(x, y2):
        plt.text(i + 0.3, j + 0.05, '%.2f' % -j, color='white')
    plt.axvline(0,color = 'r', linewidth=3)#放置0刻度線
    plt.axhline(0,color = 'k',linewidth=3)#放置縱向0刻度線
    #每個不同的bar設置不同的顏色
    bar = plt.bar(x, y1, width=1, facecolor='yellowgreen', edgecolor='white', yerr=y1 * 0.1)
    for bar, height in zip(bar, y1):
        if height < 0:
            bar.set(color='lightgreen')
    # 給圖添加text
    # zip() 函數用於將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的列表。
    plt.show()

#顯示多組柱狀圖
import matplotlib.pyplot as plt

a = [1,2,3]
b = [4,5,6]
d = [7,8,9]
y = [1,2,3]

width = 0.2
plt.bar([i-width for i in y],a,color = 'r',width=width)
plt.bar(y,b,color = 'k',width=width)
plt.bar([i+width for i in y],d,color='g',width=width)
plt.show()

import matplotlib.pyplot as plt
# 獲取bar的長寬高的信息,來設置文本
x = [10, 20,30]
y = [1,2,3]
bars = plt.bar(x,y,width=5)
for bar,data in zip(bars, x):
    x = bar.get_height()#bar的高度
    y = bar.get_x()#bar的寬度的其實位置
    m = bar.get_width()#bar的寬度
    n = bar.get_y()#bar的底部
    print(x,y,m,n)
    plt.text(y,x,data)
plt.show()

import matplotlib.pyplot as plt
#在bar中繪制不同的線來區分
x = list(range(10,18))
y = list(range(1,9))
bars = plt.bar(x,y)
patterns = ('-','+','×','*','\\','o','--','.')
for bar , pattern in zip(bars, patterns):
    bar.set_hatch(pattern)
plt.show()

 

直方圖、密度圖

def hist():
    # 直方圖+密度圖

    s = pd.Series(np.random.randn(1000))
    s.hist(bins=20,
           histtype='bar',
           align='mid',
           orientation='vertical',
           alpha=0.5,
           normed=True)
    # bin:箱子的寬度
    # normed 標准化
    # histtype 風格,bar,barstacked,step,stepfilled
    # orientation 水平還是垂直{‘horizontal’, ‘vertical’}
    # align : {‘left’, ‘mid’, ‘right’}, optional(對齊方式)
    s.plot(kind='kde', style='k--')
    plt.show()
    # 密度圖
import matplotlib.pyplot as plt

a = [1,2,3,1]
plt.hist(a)
plt.show()
如果有多個直方圖,那么可以用alpha這個透明度來區分
直方圖是什么呢?
    將所有的data進行整理,data中每個取值有多少個。

 

餅圖

餅圖
def pie():
    s = pd.Series(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], name='series')
    plt.axis('equal')  # 保證長寬相等
    plt.pie(s,
            explode=[0.1, 0, 0, 0],
            labels=s.index,
            colors=['r', 'g', 'b', 'c'],
            autopct='%.2f%%',
            pctdistance=0.6,
            labeldistance=1.2,
            shadow=True,
            startangle=0,
            radius=1.5,
            frame=False)
    plt.show()
    print(s)
    # 第一個參數:數據
    # explode:指定每部分的偏移量,餅圖之間都是分開的
    # labels:標簽
    # colors:顏色
    # autopct:餅圖上的數據標簽顯示方式
    # pctdistance:每個餅切片的中心和通過autopct生成的文本開始之間的比例
    # labeldistance:被畫餅標記的直徑,默認值:1.1
    # shadow:陰影
    # startangle:開始角度
    # radius:半徑
    # frame:圖框
    # counterclock:指定指針方向,順時針或者逆時針

import matplotlib.pyplot as plt

boy = 43
girl = 54

labels = ['girl','boy']#餅圖外面的類別指示
patches,texts, autotexts = plt.pie([girl,boy],labels = labels,autopct='%1.1f%%', colors = ['r','b'],explode = [0.05,0.05])
#labels:餅圖外面的類別指示
#autopct:餅圖上的百分比信息,當然自己也可以放置別的
#texts:餅圖外面的文字,也就是類別信息
for text in autotexts:
    text.set_color('white')
    text.set_fontsize(16)
for t in texts:
    t.set_color('black')
    t.set_fontsize(16)
plt.show(

 

箱型圖

def box1():
    # 箱型圖
    # plt.plot.box()繪制

    fig, axes = plt.subplots(2, 1, figsize=(10, 6))
    df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
    color = dict(boxes='DarkGreen', whiskers='DarkOrange', medians='DarkBlue', caps='Gray')
    # 箱型圖着色
    # boxes → 箱線
    # whiskers → 分位數與error bar橫線之間豎線的顏色
    # medians → 中位數線顏色
    # caps → error bar橫線顏色
###########################################
    df.plot.box(ylim=[0, 1.2],
                grid=True,
                color=color,
                ax=axes[0])
    # color:樣式填充
###########################################
    df.plot.box(vert=False,
                positions=[1, 4, 5, 6, 8],
                ax=axes[1],
                grid=True,
                color=color)
    # vert:是否垂直,默認True
    # position:箱型圖占位
    plt.show()
def box2():
    # 箱型圖
    # plt.boxplot()繪制
    # pltboxplot(x, notch=None, sym=None, vert=None, whis=None, positions=None, widths=None, patch_artist=None, bootstrap=None,
    # usermedians=None, conf_intervals=None, meanline=None, showmeans=None, showcaps=None, showbox=None, showfliers=None, boxprops=None,
    # labels=None, flierprops=None, medianprops=None, meanprops=None, capprops=None, whiskerprops=None, manage_xticks=True, autorange=False,
    # zorder=None, hold=None, data=None)

    df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
    plt.figure(figsize=(10, 4))
    # 創建圖表、數據

    f = df.boxplot(sym='o',  # 異常點形狀,參考marker
                   vert=True,  # 是否垂直
                   whis=1.5,  # IQR,默認1.5,也可以設置區間比如[5,95],代表強制上下邊緣為數據95%和5%位置
                   patch_artist=True,  # 上下四分位框內是否填充,True為填充
                   meanline=False, showmeans=True,  # 是否有均值線及其形狀
                   showbox=True,  # 是否顯示箱線
                   showcaps=True,  # 是否顯示邊緣線
                   showfliers=True,  # 是否顯示異常值
                   notch=False,  # 中間箱體是否缺口
                   return_type='dict'  # 返回類型為字典
                   )
    plt.title('boxplot')
    print(f)

    for box in f['boxes']:
        box.set(color='b', linewidth=1)  # 箱體邊框顏色
        box.set(facecolor='b', alpha=0.5)  # 箱體內部填充顏色
    for whisker in f['whiskers']:
        whisker.set(color='k', linewidth=0.5, linestyle='-')
    for cap in f['caps']:
        cap.set(color='gray', linewidth=2)
    for median in f['medians']:
        median.set(color='DarkBlue', linewidth=2)
    for flier in f['fliers']:
        flier.set(marker='o', color='y', alpha=0.5)
    # boxes, 箱線
    # medians, 中位值的橫線,
    # whiskers, 從box到error bar之間的豎線.
    # fliers, 異常值
    # caps, error bar橫線
    # means, 均值的橫線,

 

填圖

def fill():
    # 填圖

    fig, axes = plt.subplots(2, 1, figsize=(8, 6))

    x = np.linspace(0, 1, 500)
    y1 = np.sin(4 * np.pi * x) * np.exp(-5 * x)
    y2 = -np.sin(4 * np.pi * x) * np.exp(-5 * x)
    axes[0].fill(x, y1, 'r', alpha=0.5, label='y1')
    axes[0].fill(x, y2, 'g', alpha=0.5, label='y2')
    # 對函數與坐標軸之間的區域進行填充,使用fill函數
    # 也可寫成:plt.fill(x, y1, 'r',x, y2, 'g',alpha=0.5)#這個是單個填圖的時候

    x = np.linspace(0, 5 * np.pi, 1000)
    y1 = np.sin(x)
    y2 = np.sin(2 * x)
    axes[1].fill_between(x, y1, y2, color='b', alpha=0.5, label='area')
    # 填充兩個函數之間的區域,使用fill_between函數

    for i in range(2):
        axes[i].legend()
        axes[i].grid()
    plt.show()
    # 添加圖例、格網

 

等高圖

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10,10,5)
y = np.linspace(-20,10,5)
"""
繪制二維圖
    需要知道的信息
        我們需要知道自變量x的取值,以及y對應的取值。
    做法:
        將每個x帶入函數即可的得到y
繪制三維圖
    需要知道的信息
        我們需要知道自變量x和y的取值,也就是所有xy的取值組合,
        也就是x取第一個值,對應所有的y取值
             x取第二個值,對應所有的y取值
             。。。
        然后將上述各種組合帶入函數中就可以得到z軸
    
"""
xx,yy = np.meshgrid(x,y)
print(xx)
print(yy)
zz = xx**2 + yy**2
plt.figure()
plt.contour(xx,yy,zz,20)#contourf這個會填充進去顏色
plt.show()


xx,yy = np.meshgrid(x,y)
上面的結果
    將下面的兩張表一對一的組合起來就是一個平面的各個坐標圖
    xx將x復制5份
    yy將y^T復制5份
    [[-10.  -5.   0.   5.  10.]
     [-10.  -5.   0.   5.  10.]
     [-10.  -5.   0.   5.  10.]
     [-10.  -5.   0.   5.  10.]
     [-10.  -5.   0.   5.  10.]]
    [[-20.  -20.  -20.  -20.  -20. ]
     [-12.5 -12.5 -12.5 -12.5 -12.5]
     [ -5.   -5.   -5.   -5.   -5. ]
     [  2.5   2.5   2.5   2.5   2.5]
     [ 10.   10.   10.   10.   10. ]]

 

三維圖方式1

三維散點
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 24 16:37:21 2015

@author: Eddy_zheng
"""
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

data = np.random.randint(0, 255, size=[40, 40, 40])

x, y, z = data[0], data[1], data[2]
ax = plt.subplot(111, projection='3d')  # 創建一個三維的繪圖工程
#  將數據點分成三部分畫,在顏色上有區分度
ax.scatter(x[:10], y[:10], z[:10], c='y')  # 繪制數據點
ax.scatter(x[10:20], y[10:20], z[10:20], c='r')
ax.scatter(x[30:40], y[30:40], z[30:40], c='g')

ax.set_zlabel('Z')  # 坐標軸
ax.set_ylabel('Y')
ax.set_xlabel('X')
plt.show()

 

三維圖方式二

三維面
# -*- coding: utf-8 -*-
"""
Created on Thu Sep 24 16:17:13 2015

@author: Eddy_zheng
"""

from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)

# 具體函數方法可用 help(function) 查看,如:help(ax.plot_surface)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')

plt.show()

 

三維旋轉角度設置

ax.view_init(elev=32,azim=90)
三維圖旋轉角度
azim:正常的繪制xyz坐標的時候,也就是正視圖,做轉角度
elev:xy平面上翻角度

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM