![9c46c3f36f4c69bf80c99accba870b93.png](https://i-blog.csdnimg.cn/blog_migrate/8d37d72bb9a565df988330e75426aacb.jpeg)
R语言的ggplot2绘图能力超强,python虽有matplotlib,但是语法臃肿,使用复杂,入门极难,seaborn的出现稍微改善了matplotlib代码量问题,但是定制化程度依然需要借助matplotlib,使用难度依然很大。
好消息是python中有一个plotnine包,可以实现绝大多数ggplot2的绘图功能,两者语法十分相似,R和Python的语法转换成本大大降低。
- plotnine文档 https://plotnine.readthedocs.io/en/latest/
- R语言ggplot2文档 https://ggplot2.tidyverse.org/reference/index.html
安装
pip install plotnine
准备数据
from plotnine.data import mpg
#dataframe
mpg.head()
![952c9460dddcc2b3fdc85dadc0c011c6.png](https://i-blog.csdnimg.cn/blog_migrate/8efba09a5d157e5594e26b278fad0285.jpeg)
快速作图qplot
我们先直接看最简单好用的快速作图函数qplot(x, y, data)
- 横坐标displ
- 纵坐标cty
- 数据mpg
from plotnine import qplot
qplot(x='displ',
y='cty',
data=mpg)
![621eb3159bad887411b32bdc3f12b051.png](https://i-blog.csdnimg.cn/blog_migrate/c9f46004d78f6cf58c9a32a75bfb13b4.png)
<ggplot: (322851325)>
ggplot图层
qplot是快速作图函数,如果想让图更好看,进行私人订制,那么我们需要进行图层设计
首先设置ggplot图层(相当于买了一个高级画布),
- 数据mpg
- 横坐标x轴为displ
- 纵坐标y轴cty
在plotnine中,变量所对应的数据均可通过字段名调用
from plotnine import ggplot, geom_point, aes
ggplot(aes(x='displ', y='cty'), mpg)
![bb23ce5c4faa5998e0b64673e42363ba.png](https://i-blog.csdnimg.cn/blog_migrate/d230ae05b5f0e3265ce4b06960eb9785.png)
<ggplot: (321957793)>
图层叠加
我们可以看到,已经绘制出一个空的ggplot图层,x轴为displ,y轴为cty。
接下来我们给这个图层上加上数据对应的散点,使用geom_point()直接追加在ggplot图层之上即可。
(
ggplot(aes(x='displ', y='cty'), mpg)
+ geom_point()
)
![621eb3159bad887411b32bdc3f12b051.png](https://i-blog.csdnimg.cn/blog_migrate/c9f46004d78f6cf58c9a32a75bfb13b4.png)
<ggplot: (322466061)>
color
在上图中,散点是没有区分每辆车的气缸数cyl。
在geom_point()中,我们可以按照气缸数cyl分门别类,按照颜色显示出来
(
ggplot(aes(x='displ', y='cty'), mpg)
+ geom_point(aes(color='cyl'))
)
![451f8ba4ed4660e2fd9e1955e217373a.png](https://i-blog.csdnimg.cn/blog_migrate/4e145ed51fc43c26b9917f2506f43d37.png)
<ggplot: (323647173)>
上图挺好看的,有时候需要绘制的字段是离散型数值,但是上色后可能不够明显,需要声明该字段为离散型。这时候用factor()来告诉plotnine,这个字段是离散型数值
(
ggplot(aes(x='displ', y='cty'), mpg)
+ geom_point(aes(color='factor(cyl)'))
)
![41fecada3d7929858ece6837e894bfb8.png](https://i-blog.csdnimg.cn/blog_migrate/01438b4b737fbdcf889a30a9802f9012.png)
<ggplot: (321918425)>
size
有时候为了增加可视化显示的维度数,还可以考虑加入点的大小size
(
ggplot(aes(x='displ', y='cty'), mpg)
+ geom_point(aes(size='hwy'))
)
![23f12d6227826222248c05627d105ef8.png](https://i-blog.csdnimg.cn/blog_migrate/7fe02fe9b9dceeaf07a21f2ee1c582c2.png)
<ggplot: (323399013)>
梯度色
如果你想自己设置颜色的梯度,可以通过scale_color_gradient设置
from plotnine import scale_color_gradient
(
ggplot(aes(x='displ', y='cty'), mpg)
+ geom_point(aes(color='hwy'))
+ scale_color_gradient(low='blue', high='red')
)
![ba0bffbb32349a3c8e946b3dd87ac5ad.png](https://i-blog.csdnimg.cn/blog_migrate/f8c94e00f4d17f263f87ff8a02143544.png)
<ggplot: (323622897)>
条形图
plotnine中可绘制的图有很多,刚刚已经讲了散点图,接下来我们看看plotnine中的条形图。
首先准备一下数据
import pandas as pd
df = pd.DataFrame({
'variable': ['gender', 'gender', 'age', 'age', 'age', 'income', 'income', 'income', 'income'],
'category': ['Female', 'Male', '1-24', '25-54', '55+', 'Lo', 'Lo-Med', 'Med', 'High'],
'value': [60, 40, 50, 30, 20, 10, 25, 25, 40],
})
df['variable'] = pd.Categorical(df['variable'], categories=['gender', 'age', 'income'])
df['category'] = pd.Categorical(df['category'], categories=df['category'])
df
![f86a02a579c4509dff3bf7485af8e3ae.png](https://i-blog.csdnimg.cn/blog_migrate/8f9baa85977dc95d5904ef5f4f8845f8.png)
from plotnine import ggplot, aes, geom_text, position_dodge, geom_point
#调整文本位置
dodge_text = position_dodge(width=0.9) # new
(
ggplot(df, aes(x='variable',
y='value',
fill='category')) #类别填充颜色
+ geom_col(position='dodge',
show_legend=False) # modified
+ geom_text(aes(y=-.5, label='category'), # new
position=dodge_text,
color='gray', #文本颜色
size=8, #字号
angle=30, #文本的角度
va='top')
+ lims(y=(-5, 60)) # new
)
![83118c1e9b97e9adfd84f7612aa31a5e.png](https://i-blog.csdnimg.cn/blog_migrate/9ab5fae27ccf0d57da2e9412d336e0f1.png)
<ggplot: (334727813)>
from plotnine.data import economics_long
economics_long.head()
![89a9a88142ab3a3925348dfdf16fac58.png](https://i-blog.csdnimg.cn/blog_migrate/78ea563cbe83e347263d93fcbdfd8bab.png)
from plotnine import ggplot, aes, geom_line
(
ggplot(economics_long, aes(x='date', y='value01', color='variable'))
+ geom_line()
)
![da9bc36cc63901ee98f6af95709dd691.png](https://i-blog.csdnimg.cn/blog_migrate/b1e23bf65b7c17f8f62802b4457a6ec4.jpeg)
<ggplot: (334895445)>
plotnine目前已经支持绝大多数ggplot2,但是文档方面没有ggplot2全,所以学习plotnine时可以参考ggplot2。
- plotnine文档 https://plotnine.readthedocs.io/en/latest/
- R语言ggplot2文档 https://ggplot2.tidyverse.org/reference/index.html