R里面的ggplot2画图很好看,但是我对python更熟悉,有没有能再python中画出ggplot2的图呢,是可以的
https://towardsdatascience.com/practical-data-visualization-guide-seaborn-vs-ggplot2-9747d9153ade
python seaborn
import numpy as np
import pandas as pd
import seaborn as sns
sns.set(style='darkgrid')
titanic = pd.read_csv("../../DL学习/小数据集/train.csv")
titanic.drop(['PassengerId', 'Name', 'Ticket'],
axis=1, inplace=True)
titanic.head()
sns.displot(data=titanic, x="Age", col="Survived", kind="hist")
titanic = titanic[titanic.Fare < 300]
sns.relplot(data=titanic, x="Age", y="Fare", kind="scatter",
hue="Survived", row="Sex", col="Pclass",
height=4)
R ggplot2
library(ggplot2)
library(data.table)
titanic <- fread("/Users/xiaokangyu/Desktop/DL学习/小数据集/train.csv")
titanic[, c("PassengerId", "Name", "Ticket"):=NULL]
print(head(titanic))
titanic$Survived=as.factor(titanic$Survived) # 需要先转化成factor
print(ggplot(data = titanic) +
geom_point(mapping = aes(x = Age, y = Fare, color =
Survived)))
t <- ggplot(titanic, aes(Age)) +
geom_histogram(bins=10, fill='lightblue')
print( t + facet_grid(cols=vars(Survived)))
titanic <- titanic[Fare < 300]
t <- ggplot(titanic, aes(x=Age, y=Fare, color=Survived)) + geom_point()
print(t + facet_grid(cols=vars(Pclass), rows=vars(Sex)))
结果如下
此外我发现了一个好东西,已经有人做好了python的库,很完美的复现ggplot的结果了,
安装
https://plotnine.readthedocs.io/en/stable/installation.html
pip install 'plotnine[all]'
plotnine使用案例
import pandas as pd
from plotnine import *
from plotnine.data import mtcars
%matplotlib inline
import numpy as np
import pandas as pd
import seaborn as sns
sns.set(style='darkgrid')
titanic = pd.read_csv("../../DL学习/小数据集/train.csv")
titanic.drop(['PassengerId', 'Name', 'Ticket'],
axis=1, inplace=True)
titanic.head()
((ggplot(data = titanic) +
geom_point(mapping = aes(x = 'Age', y = 'Fare', color =
'Survived')))
)
可以看到这个结果和R中的结果是一模一样的,而且代码格式可以直接复制过来
我今天又找到一种在python中画ggplot的图
http://r-statistics.co/Top50-Ggplot2-Visualizations-MasterList-R-Code.html
即在jupyter中执行这个操作
%load_ext rpy2.ipython
%%R
# install.packages("ggplot2")
# load package and data
options(scipen=999) # turn-off scientific notation like 1e+48
library(ggplot2)
theme_set(theme_bw()) # pre-set the bw theme.
data("midwest", package = "ggplot2")
# midwest <- read.csv("http://goo.gl/G1K41K") # bkup data source
# Scatterplot
gg <- ggplot(midwest, aes(x=area, y=poptotal)) +
geom_point(aes(col=state, size=popdensity)) +
geom_smooth(method="loess", se=F) +
xlim(c(0, 0.1)) +
ylim(c(0, 500000)) +
labs(subtitle="Area Vs Population",
y="Population",
x="Area",
title="Scatterplot",
caption = "Source: midwest")
plot(gg)
结果如下
补充内容
今天我又学习了一个这个plotnine这个包,发现这个是真的好用,但是其中python中ggplot画图还是有些需要主要注意的地方,这里总结一下
首先我发现这个库对scipy1.8.1是不兼容的,应该得保证scipy是1.4.1或者1.5.1·,否则会报错
import pandas as pd
from plotnine import *
from plotnine.data import mtcars
%matplotlib inline
ToothGrowth=pd.read_csv("/Users/xiaokangyu/Desktop/dataset/other/ToothGrowth/ToothGrowth.csv",index_col=0,header=0)
#ToothGrowth
ToothGrowth["dose"]=ToothGrowth["dose"].astype("category")
# 注意点1
# 如果在R中是factor类型的数据
# 那么在python中需要转换成category类型,否则作图还是和R不一样的,需要注意
# 注意点2
# 在R中写变量的名称是不需要带引号的,而在python中是必须带的,所以还是不能把R中的代码直接复制过来运行,而是需要
# 稍微修改一下
如果不提前转换成category类型,画的图只有一个箱线,而不是三个
我之前一直以为python中的ggplot一定得加入括号,其实也是没有必要的
所以有了这个,我测试了ggplot的加语法,发现和R中的ggplot2保持一致
同理画多组箱线图
保存结果
ggsave(p,file="./py_ggplot.png")
这里虽然我包成成png,但是最终的结果还是pdf,不过影响不大