Skip to main content

[Intermediate Python] - Matplotlib: Basic plots with matplotlib


Trong bài này, bạn sẽ được học cách hình dung dữ liệu thực tế, cách lưu trữ dữ liệu trong các cấu trúc dữ liệu mới; khi đã thành thạo các cấu trúc điều khiển, bạn cần điều chỉnh các đoạn scripts và các thuật toán, chúng ta sẽ  kết thúc chương này với một bài tập nhỏ và chúng ta sẽ phải kết hợp mọi thứ đã  học để giải quyết bài toán. 

LÝ THUYẾT
Phần đầu tiên của chương là về cách hình dung dữ liệu (data visualization), nó rất quan trọng trong việc phân tích dữ liệu. Đầu tiên, bạn sẽ sử dụng nó để khám phá tập dữ liệu (dataset) để hiểu dữ liệu của bạn một cách rõ nhất, từ đó bạn mới có một cái nhìn sâu sắc về nó, và chia sẻ cái mà bạn đã nhận thức được từ dữ liệu với người khác  

Ví dụ: ta nhìn vào biểu đồ xinh đẹp bên trên, nó được tạo bởi giáo sư người Thụy Sĩ Hans Rosling, giáo sư nói về sự phát triển dân số toàn cầu được xem hàng triệu lần và sắp xếp chúng tạo nên 1 biểu đồ, giáo sư đã để dữ liệu nói lên lịch sử của chính nó. Ở đây, chúng ta thấy một biểu đồ với nhiều vòng tròn, mỗi 1 vòng tròn thể hiện một quốc gia, đường kính của vòng tròn tương ứng với dân số của quốc gia đó, nhìn biểu đồ, ta dễ dàng thấy 2 vòng tròn lớn nhất đó là Trung Quốc và Ấn Độ. Có 2 trục, trục ngang thể hiện GDP bình quân đầu người tính trên USD, trục dọc thể hiện tuổi thọ, rõ ràng, ta thấy người dân sống thọ hơn ở các nước có GDP bình quân đầu người cao hơn. Vậy, có một sự khác biệt lớn giữa tuổi thọ giữa các nước có cùng mức thu nhập. Tôi nói với bạn những thứ trên để làm gì? Bởi vì, cuối chương này, chúng ta cũng sẽ tự xây dựng một biểu đồ tuyệt đẹp như vậy :) 

Có rất nhiều package mô hình hóa dữ liệu trong Python, nhưng nổi trội hơn cả chính là Matplotlib. Chúng ta sẽ cần đến package con của Matplotlib là pyplot, package này được import vào như một biến tên là plt 
In [1]: import matplotlib.pyplot as plt
Trong ví dụ đầu tiên, chúng ra sẽ cố gắng đạt được một số hiểu biết sâu sắc về sự tiến hóa của dân số thế giới. Ta có một danh sách các năm trong biến year và danh sách dân số tương ứng (đơn vị tính là tỉ người), và danh sách pop
In [2]: year = [1950, 1970, 1990, 2010]
In [3]: pop = [2.5193.6925.2636.972]
Năm 1970 có 3.7 tỉ người sống trên hành tinh này. Để mô hình hóa dữ liệu này như là một biểu đồ đường thẳng, chúng ta gọi hàm plot() và truyền vào 2 tham số là yearpop: tham số thứ nhất tương ứng với trục ngang, còn tham số thứ 2 tương ứng với trục dọc
In [4]: plt.plot(year, pop)
Bạn có thể nghĩ là biểu đồ sẽ hiển thị lên ngay bây giờ, nhưng không Python khá là lười biếng, nó đợi đến khi ta gọi hàm show() thì lúc đó biểu đồ mới hiển thị.
In [5]: plt.show()
Bởi vì bạn có thể muốn thêm 1 vài thành phần vào biểu đồ trước khi hiển thị nó, chẳng hạn như tựa, nhãn,... Chúng ta sẽ bàn đến vấn đề này sau, giờ chỉ nên nhớ rằng: hàm plot() nói với Python rằng trình bày cái gì và trình bày như thế nào, hàm show() hiển thị biểu đồ. Khi nhìn vào biểu đồ, chúng ta thấy rằng các năm được đánh số trên trục ngang, còn dân số được đánh số trên trục đứng, có 4 điểm dữ liệu và Python đã vẽ một đường thẳng để nối chúng lại.

Năm 1950, dân số thế giới ở khoảng 2.5 tỉ người, nhưng năm 2010 vào khoảng 7 tỉ người, ta thấy dân số thế giới tăng gấp 3 lần trong vòng 60 năm, nó thật sự đáng sợ. Chuyện gì sẽ xảy ra nếu cứ tiếp tục tăng trưởng như vậy?? Chúng ta sẽ tìm được câu trả lời trong phần bài tập.
Tôi đã trình bày xong phần giới thiệu cơ bản về một kiểu khác của biểu đồ: đó là biểu đồ phân tán (scatter plot). Để tạo ra biểu đồ này, chúng ta thay hàm plot() thành hàm scatter, kết quả của biểu đồ scatter là những điểm dữ liệu độc lập và Python không nối các điểm này với nhau bằng đường thẳng như trước đó nữa.
In [4]: plt.scatter(year, pop)
Trong một vài ứng dụng, biểu đồ phân tán thường là lựa chọn tốt hơn so với biểu đồ đường thẳng, do đó nên nhớ đến hàm scatter() nhé!


BÀI TẬP
Bài 1: Line plot (1)
   Với matplotlib, bạn có thể tạo một nhóm các biểu đồ khác nhau trong Python, biểu đồ cơ bản nhất là biểu đồ đường thẳng (line plot). Công thức được cho ở đây
import matplotlib.pyplot as plt
plt.plot(x,y)
plt.show()
Trong phần lý thuyết ta thấy sự tăng dân số nhanh đến mức nào trong những năm qua. Liệu chúng có tiếp tục tăng như thế nữa không? Ngân hàng thể giới ước lượng dân số thể giới cho những năm 1950 đến 2100. Các năm được cho vào 1 biến danh sách year, và tương ứng với biến danh sách pop chỉ số dân. Bạn thực hiện các lệnh theo yêu cầu sau:
  • Hiển thị phần tử cuối cùng ở biến yearpop để thấy được dự đoán dân số năm 2100. Sử dụng hàm print()
  • Trước khi bắt đầu. bạn nên import matplotlib.pyplot thành plt. pyplot là một packet con của matplotlib nên phải theo sau dấu chấm (.)
  • Sử dụng plt.plot() để xây dựng biểu đồ đường thẳng, year tương ứng với trục ngang, pop tương ứng với trục đứng. Đừng quên sử dụng hàm show() để hiện ra biểu đồ nhé!
Bài 2: Line plot (2)
   Với một biểu đồ tương đối giống với cái mà ta đã vẽ trong bài tập 1, nó được trình bày trong hình dưới. Nhìn vào biểu đồ và cho biết năm nào mà dân số thế giới xấp xỉ 10 tỉ người?
A - 2040
B - 2060
C - 2085
D - 2095

Bài 3: Line plot (3)
   Bây giờ ta sẽ xây dựng một biểu đồ thẳng đầu tiên, hãy bắt đầu với dữ liệu của giáo sư Hans Rosling được thu thập năm 2007. Có 2 danh sách có sẵn cho chúng ta:
  • life_exp: nó chứa tuổi thọ của mỗi quốc gia
  • gdp_cap: chứa GDP bình quân đầu người tính bằng USD
GDP là chữ viết tắt của Gross Domestic Product nó thể hiện quy mô nền kinh tế của một quốc gia, nếu ta chia cho số dân thì ta sẽ có được GDP bình quân đầu người. Bây giờ hãy thực hiện các yêu cầu sau:
  • In ra giá trị cuối cùng của 2 danh sách gdp_caplife_exp >> đó là dữ liệu của Zimbabwe.
  • Xây dựng một biểu đồ thẳng với gdp_cap là trục ngang, life_exp là cột đứng. 
  • Đừng quên hoàn thành bằng câu lệnh plt.show() để hiển thị biểu đồ ra màn hình.

Bài 4: Scatter Plot (1)
   Khi ta có thời gian để xem các giá trị trên trục ngang thì biểu đồ đường thẳng phù hợp, nhưng trong một số trường hợp, khi ta cố gắng đánh giá sự tương quan giữa 2 biến thì biểu đồ phân tán (scatter plot) sẽ hữu dụng hơn. Dưới đây là ví dụ làm sao để tạo 1 biểu đồ scatter
import matplotlib.pyplot as plt
plt.scatter(x,y)
plt.show()
Hãy tiếp tục với dữ liệu có sẵn là gdp_caplife_exp ở trong phần bài trước và thực hiện các yêu cầu sau:
  • Thay đổi dòng lệnh có sẵn để được 1 biểu đồ scatter
  • plt.plot(gdp_cap, life_exp)
  • Thêm vào dòng plt.xscale('log') để thấy được sự quan giữa GDP bình quân đầu người trên quy mô logic.
  • Hoàn thành bằng câu lệnh plt.show() để hiển thị biểu đồ ra màn hình
Bài 5: Scatter Plot (2)
    Trong bài tập trước, bạn thấy rằng GDP thường tương ứng với tuổi thọ cao, nói cách khác, nó có sự tương quan với nhau. Bạn có nghĩ rằng có mối liên hệ giữa dân số và tuổi thọ trong một đất nước? biến danh sách life_exp ở bài tập trước đã có sẵn, biến pop cũng có sẵn, nó liệt kê dân số ở các nước năm 2007 (đơn vị tính là triệu người). bây giờ bạn thực hiện các yêu cầu sau:
  • Bắt đầu với scratch bằng cách import thư viện matplotlib.pyplot as plt
  • Tạo  một biểu đồ scatter, pop tương ứng với cột ngang, life_exp tương ứng cột dọc
  • Cuối cùng hiển thị biểu đồ bằng hàm show()

BÀI GIẢI
Bài 1: Line plot (1)
# Print the last item from year and pop
print(year[-1])
print(pop[-1])

# Import matplotlib.pyplot as plt
import matplotlib.pyplot as plt

# Make a line plot: year on the x-axis, pop on the y-axis
plt.plot(year, pop)

# Display the plot with plt.show()
plt.show()

Bài 2: Line plot (2)
   Đáp án: B

Bài 3: Line plot (3)
# Print the last item of gdp_cap and life_exp
print(gdp_cap[-1])
print(life_exp[-1])

# Make a line plot, gdp_cap on the x-axis, life_exp on the y-axis

plt.plot(gdp_cap,life_exp)

# Display the plot

plt.show()

Bài 4: Scatter (1)
# Change the line plot below to a scatter plot
plt.scatter(gdp_cap, life_exp)

# Put the x-axis on a logarithmic scale

plt.xscale('log')

# Show plot

plt.show()

Bài 5: Scatter (2)
# Import package
import matplotlib.pyplot as plt

# Build Scatter plot

plt.scatter(pop, life_exp)

# Show plot

plt.show()

Popular posts from this blog

[Intermediate Python] - Matplotlib: Histogram

Bài viết này giới thiệu về histogram, histogram là cách nhìn rất hữu ích để khám phá dữ liệu LÝ THUYẾT Hãy tưởng tượng có 12 giá trị giữa 0 và 6 và tôi đặt nó trên 1 đường thẳng, để xây dựng một biểu đồ histogram cho những giá trị này, tôi sẽ chia đường thẳng thành những đoạn bằng nhau, được gọi là những ngăn (bins). Giả sử bạn có 3 ngăn, mỗi ngăn có độ rộng là 2, tiếp theo bạn đếm xem có bao nhiêu điểm dữ liệu bên trong mỗi ngăn, ở đây ta có 4 điểm trong ngăn 1, 6 điểm trong ngăn 2 và 2 điểm trong ngăn 3, cuối cùng, ta sẽ vẽ 1 thanh biểu trưng cho mỗi ngăn, chiều cao của thanh tương ứng với số lượng điểm dữ liệu trong ngăn đó. Kết quả của biểu đồ cho ta một cái nhìn tổng quan về cách mà 12 giá trị được phân phối, một vài giá trị ở ngăn giữa, nhưng có nhiều giá trị nhỏ hơn 2 và lớn hơn 4.  Tất nhiên, matplotlib cũng có khả năng tạo biểu đồ histograms, như bài học trước thì ta cũng cần phải import gói pyplot bên trong matplotlib, tiếp theo ta có thể sử dụng hàm hist() ...

[Intermediate Python] - Matplotlib: Customization

Tạo một biểu đồ là việc đơn giản, tuy nhiên tạo một biểu đồ đúng đưa ra một thông điệp rõ ràng, đó là một thách thức thực sự. Với mỗi thể hiện, ta có nhiều sự lựa chọn, trước tiên, có rất nhiều loại biểu đồ, mỗi loại biểu đồ, ta có vô hạn các thông số điều chỉnh, bạn có thể thay đổi màu sắc, hình dạng, nhãn, các trục và vân vân ...  Sự lựa chọn phụ thuộc 1 là vào dữ liệu, 2 là vào câu chuyện, ý nghĩa mà bạn muốn thể hiện từ dữ liệu đó. Bởi vì có rất nhiều tùy biến, cách tốt nhất là chúng ta phải học chúng từ các ví dụ. Hãy bắt đầu với đoạn code sau đây để tạo một biểu đồ đường thẳng. import matplotlib.pyplot as plt  year = [1950, 1951, 1952, ..., 2100]  pop = [2.538, 2.57, 2.62, ..., 10.85]  plt.plot(year, pop)  plt.show() Nó đơn giản là tạo một biểu đồ thẳng giống như các bài trước mà ta đã thực hành, nhưng bây giờ year và pop là những biến chứa nhiều dữ liệu hơn, nó bao gồm các dự án đến tận năm 2100 được dự báo bởi Liên hiệp quốc. Nếu chú...