在Python最强大的功能中,它有无穷无尽的能力,通过简单易用的图形工具来直观地展示数据。传统的matplotlib包通常是Python初学者首先要学习的。Matplotlib也被pandas包采用,它是数据科学中使用的事实上的工具。另一个名为seaborn的包将matplotlib的绘图能力提升到了一个新的水平。它们在Python笔记本中使用时看起来特别好。还有其他的Python图形工具,如Plotly、Bokeh和Altair包。
为什么使用Python图形工具?
Python是数据科学和机器学习的首选编程语言。数据往往来自于噪声源,存在缺失或不正确的值。在其他情况下,在进行进一步处理之前,有必要对数据有一个初步的了解。数据可视化是选择适当的数字分析方法的重要第一步。
使用Python图形工具可以创建什么样的图?
- 线形图
- 散点图
- 柱状图
- 饼状图
- 热图
- 等高线图
- 3D图
- 动画
最常见的Python图形工具是什么?
Matplotlib是传统的绘图包,用于数十万个Python包。
开始入门
我将从最基本的部分开始。我们需要两个点的列表--用于散点图的x轴和y轴。
import numpy as np
import matplotlib.pyplot as plt
X = [1,2,3,4,5]
Y = [6,7,8,9,10]
plt.plot(X,Y)
plt.show()
使用用于Python和NumPy的matplotlib图形工具绘制函数
让我们使用NumPy包创建一个简单的数据集,并绘制简单的数学函数。我们需要一组等距的点作为X轴。这可以用NumPy的range函数来完成。在Y轴上,我们将绘制一些直线和曲线。顺便说一下--这就是range的正确拼写--把它想成 "一个范围 "而不是 "排列"。
我将定义lambda函数。它们通常被认为是高级的 Python 概念,但实际上它们非常简单。lambda 函数是在一行中写一个函数的简明方式。例如,我定义了函数multiply ,它接收两个数字a和b,并返回它们的乘积,a*b。然后我通过调用multiply函数并给出x轴上的点列表和一个数字作为参数来设置我们想要绘制的Y值。
我将定义两条线,一条是y的每个值都与x相同,另一条是y是x的两倍。
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(0,100)
multiply = lambda a,b: a*b
Y1 = multiply(X,1)
Y2 = multiply(X,2)
plt.plot(X,Y1)
plt.plot(X,Y2)
plt.show()
我们也可以绘制曲线。一个简单的抛物线是由x2定义的,所以我可以再次使用乘法函数来创建点。
Y3 = multiply(X,X)
如何改变颜色和线条风格
Python 会自动给线条分配不同的颜色,然而,有时改变它们是很有用的。这可以通过指定颜色的名称来实现。通过搜索CSS颜色,可以在网上找到一个完整的颜色列表。
plt.plot(X,Y1,color='lightgreen')
plt.plot(X,Y2,color='royalblue')
plt.plot(X,Y3,color='mediumorchid')
线条可以被绘制成不同的样式,如点状或虚线。这是由参数linestyle设置的。
plt.plot(X,Y1,linestyle='dashed')
plt.plot(X,Y2,linestyle='dotted')
plt.plot(X,Y3,linestyle='dashdot')
有一种更简短的方法来定义线条类型和/或颜色。例如,一个红色的虚线是通过以下方式定义的
plt.plot(X,Y1,'r--')
一个蓝色的虚线可以用
plt.plot(X,Y2,'b:')
而绿色点状线则是简单的
plt.plot(X,Y3,'g-.')
这些点可以单独作为标记画出来。这与上面的语法类似。有许多标记样式--点、正方形、三角形等等。
plt.plot(X,Y1,'r.')
plt.plot(X,Y2,'bo')
plt.plot(X,Y3,'g^')
线条的粗细可以用线宽属性来调整。
plt.plot(X,Y1,linewidth=1)
plt.plot(X,Y2,linewidth=2)
plt.plot(X,Y3,linewidth=3)
如何设置标签?
import numpy as np
import matplotlib.pyplot as plt
X = np.arange(0,20)
multiply = lambda a,b: a*b
Y1 = multiply(X,1)
Y2 = multiply(X,2)
Y3 = multiply(X,X)
plt.plot(X,Y1,label='Y = X')
plt.plot(X,Y2,label = 'Y = 2*X')
plt.plot(X,Y3,label = 'Y = X$^2$')
plt.legend()
plt.title('Plotting simple functions')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
如何最好地绘制大量的数据?
大量的数据通常使用pandas包来处理。它利用matplotlib来制作一些基本的数据图,包括线图、柱状图和条形图。高级的例子可以在pandas的文档中找到。
我已经下载了著名的虹膜数据集的一小部分CSV格式。它包含了三种鸢尾花的大量属性的各种数据,包括萼片长度和宽度以及花瓣长度和花瓣宽度。
用pandas加载数据
下面的代码将关于鸢尾花的数据加载到一个数据框中。它自动分配了CSV文件中的列名。Pandas采用了matplotlib的绘图方法来轻松创建图表。我将把萼片的长度和宽度绘制成一个直方图。
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("iris.csv")
print(data)
data["sepal_length"].plot(kind = "hist", label = "sepal_length")
data["sepal_width"].plot(kind = "hist", label = "sepal_width")
plt.legend()
plt.show()
输出结果看起来像这样。
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
.. ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
[150 rows x 5 columns]
Pandas的功能很丰富,要想了解所有可能的细节,还需要几篇文章。更多的信息和例子可以在pandas的文档中找到。
如何一次绘制多张图?
虽然matplotlib是传统的Python图形工具,但有大量的参数需要设置。Pandas大大简化了这个过程。
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("iris.csv")
data.plot(subplots=True)
plt.legend()
plt.show()
如何使绘图更加赏心悦目?
pandas的图形相当不错,可以清楚地告诉人们数据的分布,然而,还有改进的余地。seaborn包带来了明显的改进。
使用下面的代码可以将数据分布可视化为柱状图。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
iris = pd.read_csv("iris.csv")
sns.set_style("whitegrid")
sns.distplot(iris['sepal_length'])
plt.show()
一个更详细的数据之间的关联图也很容易做。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
iris = pd.read_csv("iris.csv")
sns.pairplot(data = iris)
plt.show()
除了matplotlib,还有哪些替代方案?
Plotly是什么样的?
Plotly最初是为Javascript编写的。它可以做图,也可以做互动图。它有一套惊人的功能,包括在地理地图上绘制数据。下面的代码创建了一个本地服务器,并在浏览器中打开视图,用户可以旋转地球,用鼠标悬停以获得更多细节。这个Python图表工具非常方便,而且完全不需要知道任何Javascript。
import plotly.express as px
df = px.data.gapminder().query("year==2007")
fig = px.scatter_geo(df, locations="iso_alpha", color="continent",
hover_name="country", size="pop",
projection="orthographic")
fig.show()
Bokeh的好处是什么?
Bokeh是一个适合高级用户的专业工具。它还能生成交互式图表。在他们的网页上有一个详细的教程,创建Jupyter笔记本来测试。这绝对值得尝试。
Altair怎么样?
Altair是用户友好型的,但非常强大。下面我再次使用虹膜数据集。
在内部,Altair准备了一个json风格的字符串,定义了绘图。它可以将输出结果保存为一个嵌入图形的HTML文件。
import pandas as pd
import altair as alt
import matplotlib.pyplot as plt
data = pd.read_csv("iris.csv")
chart = alt.Chart(data).mark_bar().encode(
x='petal_length',
y='petal_width',
)
chart.save('chart.html')
总结
有很多Python的图形工具。它们为绘图提供了各种各样的工具和设置。这主要取决于个人的喜好,你最喜欢哪一个。这对Python初学者来说是非常好的。