數據可視化:折線圖、直方圖、散點圖


目錄

1、折線圖

2、直方圖

3、散點圖

4、顏色映射(colormap)

5、pygal模塊(svg格式)

6、隨機漫步

重要知識點

import matplotlib.pyplot as plt  -- 繪制2D折線圖,直方圖,散點圖等

import numpy as np   -- 將列表轉換為數組,給圖形上每個點添加標簽時會用到

import pygal  -- pygal是一個SVG圖表庫。SVG是一種矢量圖格式,全稱Scalable Vector Graphics -- 可縮放矢量圖形。

from random import choice -- 生成隨機漫步數據,函數choice([])從列表中隨機輸出一個數

from random import randint --randint()從一個區間隨機返回一個數

1、折線圖

plt.plot() 繪制折線圖

np.array() 將列表轉換為存儲單一數據類型的多維數組,例如[1 2 3 4 5] 

zip(x,y) 函數用於將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的對象,這樣做的好處是節約了不少的內  存。我們可以使用 list() 轉換來輸出列表。如果各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同,利用*號操作符,可以將組解壓為列表,例如a1,a2 = zip(*zip(a,b))

plt.annotate() 給折線點設置(x,y)坐標值

plt.tick_params() 設置刻度線和標簽的大小,顏色,內外側,both代表xy同時設置

plt.title()設置圖表標題

plt.xlabel() 設置X軸標簽

plt.ylabel() 設置Y軸標簽

plt.axis([]) 設置X,Y軸刻度的取值范圍 

plt.savefig('') 保存圖表為圖片格式

plt.show() 打開matplotlib查看器,並顯示繪制的圖形

#模塊pyplot包含很多生成圖表的函數
import matplotlib.pyplot as plt
import numpy as np
input_values = [1,2,3,4,5,6]
squares = [1,4,9,16,25,36]
#plot()繪制折線圖
plt.plot(input_values,squares,linewidth=5,color='m')
#np.array()將列表轉換為存儲單一數據類型的多維數組
x = np.array(input_values)
y = np.array(squares)
#annotate()給折線點設置坐標值
for a,b in zip(x,y):
    plt.annotate('(%s,%s)'%(a,b),xy=(a,b),xytext=(-25,15),
                 textcoords='offset points')
#設置標題
plt.title('Square Numbers',fontsize=24)
plt.xlabel('Value',fontsize=14)
plt.ylabel('Square of Value',fontsize=14)
#設置刻度線和標簽的大小,顏色,內外側,both代表xy同時設置
plt.tick_params(axis='both',direction='in',colors='c',labelsize=14)
plt.axis([0,8,0,45])
plt.savefig('images\line_chart.png')
#show()打開matplotlib查看器,並顯示繪制的圖形
plt.show()

2、直方圖

plt.bar() 繪制直方圖

plt.text() 給條形柱添加標簽

import numpy as np
import matplotlib.pyplot as plt
#創建帶數字標簽的直方圖
numbers = list(range(1,11))
x = np.array(numbers)
y = np.array([a**2 for a in numbers])
#繪制圖形
plt.bar(x,y,width=0.5,align='center',color='c')
plt.title('Square Numbers',fontsize=24)
plt.xlabel('Value',fontsize=14)
plt.ylabel('Square of Value',fontsize=14)
plt.tick_params(axis='both',labelsize=14)
#設置xy軸坐標取值范圍
plt.axis([0,11,0,110])
#設置標簽,a,b代表標簽的坐標,第二個為標簽內容,然后是對齊方式和尺寸
for a,b in zip(x,y):
    plt.text(a,b+0.1,'%.0f'%b,ha = 'center',va = 'bottom',fontsize=7)
plt.savefig('images\squares.png')
plt.show()

3、散點圖

plt.scatter() 繪制散點圖

#scatter()繪制散點圖
import matplotlib.pyplot as plt
x_values = list(range(1,11))
y_values = [x**2 for x in x_values]
#參數c為點的顏色,默認藍色;edgecolor為點的輪廓顏色,默認黑色,none為無色
plt.scatter(x_values,y_values,c='white',edgecolor='green',s=1000)
'''
還可以使用RGB模式,向參數c傳遞一個元組,包含三個0-1之間的小數,
他們分別代表紅綠藍的份量,越接近0,顏色越深,越接近1,顏色越淺
c=(0,0,0.8),代表淡藍色
'''
#設置標題
plt.title('Square Numbers',fontsize=24)
plt.xlabel('Value',fontsize=14)
plt.ylabel('Square of Value',fontsize=14)
#設置刻度的大小,both代表xy同時設置
plt.tick_params(axis='both',labelsize=14)
#設置坐標軸的取值范圍
plt.axis([0,11,-20,110])
#plt.savefig('images\squares_plot1.png')
plt.show()

4、顏色映射(colormap)

#根據每個點的Y值來設置顏色映射
x_values = list(range(1,11))
y_values = [x**2 for x in x_values]
'''參數c設置成Y值列表,代表各點的先后順序,使用參數camp告訴
pyplot使用什么顏色映射,s為點的大小
'''
plt.scatter(x_values,y_values,c=y_values,cmap=plt.cm.Reds,
            edgecolor='green',s=1000)
plt.title('Square Numbers',fontsize=24)
plt.xlabel('Value',fontsize=14)
plt.ylabel('Square of Value',fontsize=14)
plt.tick_params(axis='both',labelsize=14)
plt.axis([0,11,-20,110])
#savefig()自動保存圖表,第二個參數表示刪除圖表多余的空白區域
plt.savefig('images\squares_plot2.png',bbox_inches='tight')
plt.show()

5、pygal模塊(svg格式)

randint(1,5) 從一個區間隨機返回一個數,包括兩端的數
hist = pygal.Bar() 定義直方圖類
hist.x_labels=[]  設置X軸刻度
hist.x_title='' X軸標題
hist.y_title='' Y軸標題
hist.add(' ',[]) 繪制直方圖,''內為圖表標題
hist.render_to_file('') 保存到文件夾
#pygal模塊:創建可縮放的矢量圖形文件(.svg)
import pygal
from random import randint
class Die():
    def __init__(self,num_sides=6):
        self.num_sides = num_sides
    def roll(self):
        '''函數randint()返回一個區間的任意數值'''
        return randint(1,self.num_sides)
#創建一個6面骰子,搖1000次,將結果存在列表中
die_1 = Die()
die_2 = Die(10)
results = [die_1.roll() + die_2.roll() for roll_num in range(5000)]
#分析每一種結果的出現頻率,存在一個列表中
max_result = die_1.num_sides + die_2.num_sides
frequencies = [results.count(value) for value in range(2,max_result+1)]
#對結果進行可視化,hist:頻數直方圖
hist = pygal.Bar()
hist.x_labels = list(range(2,max_result+1,1))#x軸刻度
hist.x_title = 'Result' # 標題
hist.y_title = 'Freqency of Rsult'
#add()向它傳遞一個指定的標簽,一個列表,包含將出現在圖表中的值
hist.add('D6 + D10',frequencies)
hist.render_to_file('images\hist.svg')

6、隨機漫步

choice([])從列表中隨機輸出一個數

figure()用於指定圖表的寬度、高度、分辨率和背景色,形參figsize需要指定一個元組,單位為英寸,dpi為分辨率,facecolor為窗口邊框顏色

plt.axes().get_xaxis().set_visible(False) 隱藏坐標軸

line = pygal.Line() 繪制可縮放的折線圖

import matplotlib.pyplot as plt
import pygal
from random import choice
class RandomWalk():
    '''一個生成隨機漫步數據的類'''
    def __init__(self,num_points):
        self.num_points = num_points
        #所有的隨機漫步都始於(0,0)
        self.x_values = [0]
        self.y_values = [0]
    def get_step(self):
        direction = choice([1, -1])  # 隨機選擇向左向右兩個方向
        distance = choice([0, 1, 2, 3, 4, 5, 6, 7, 8])  # 隨機選擇移動的距離
        return direction * distance  # 每次移動的步長
    def fill_walk(self):
        '''定義一個循環,直到達到給定的點數'''
        while len(self.x_values) < self.num_points:
            x_step = self.get_step()
            y_step = self.get_step()
            #拒絕原地踏步
            if x_step and y_step == 0:
                continue
            #計算下一個點的xy值,用列表的最后一個值加上步長
            next_x = self.x_values[-1] + x_step
            next_y = self.y_values[-1] + y_step
            self.x_values.append(next_x)
            self.y_values.append(next_y)
rw = RandomWalk(5000)
rw.fill_walk()
#繪制特定窗口尺寸和分辨率的隨機漫步散點圖
plt.figure(figsize=(6,6),dpi=128,facecolor='palegreen')
point_numbers = list(range(rw.num_points))
#以顏色映射的方式展示出來,可以看出漫步中各點的先后順序
plt.scatter(rw.x_values,rw.y_values,c=point_numbers,
            cmap=plt.cm.Greens,edgecolor='none',s=1)
#重新繪制第一個和最后一個點,突出顯示
plt.scatter(0,0,c='red',edgecolors='none',s=100)
plt.scatter(rw.x_values[-1],rw.y_values[-1],c='orange',
            edgecolors='none',s=100)
#exes()隱藏坐標軸
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
#plt.savefig(r'images\random_plot1.png')
plt.show()
'''生成隨機漫步折線圖'''
rw = RandomWalk(5000)
rw.fill_walk()
plt.plot(rw.x_values,rw.y_values,color='cyan',linewidth=1)
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
plt.show()
'''利用pygal實現隨機漫步折線圖'''
lc = RandomWalk(5000)
lc.fill_walk()
line_chart = pygal.Line()
line_chart.x_labels = map(str, range(0, 9))
line_chart.add('random',lc.y_values)
line_chart.render_to_file(r'images\random.svg')

 


免責聲明!

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



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