python - 使用 matplotlib 和 seaborn 创建圆形密度图
问题描述
我正在尝试创建下面两个图像的组合。
基本上我想要密度图的设计,但围绕一个圆圈而不是正常的 X/Y 图表设置。
下面是 Python 中密度图的代码。
# !pip install brewer2mpl
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
import warnings; warnings.filterwarnings(action='once')
large = 22; med = 16; small = 12
params = {'axes.titlesize': large,
'legend.fontsize': med,
'figure.figsize': (16, 10),
'axes.labelsize': med,
'axes.titlesize': med,
'xtick.labelsize': med,
'ytick.labelsize': med,
'figure.titlesize': large}
plt.rcParams.update(params)
plt.style.use('seaborn-whitegrid')
sns.set_style("white")
#%matplotlib inline
# Version
print(mpl.__version__) #> 3.0.0
print(sns.__version__) #> 0.9.0
# Import Data
df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")
# Draw Plot
plt.figure(figsize=(16,10), dpi= 80)
sns.kdeplot(df.loc[df['cyl'] == 4, "cty"], shade=True, color="g", label="Cyl=4", alpha=.7)
sns.kdeplot(df.loc[df['cyl'] == 5, "cty"], shade=True, color="deeppink", label="Cyl=5", alpha=.7)
sns.kdeplot(df.loc[df['cyl'] == 6, "cty"], shade=True, color="dodgerblue", label="Cyl=6", alpha=.7)
sns.kdeplot(df.loc[df['cyl'] == 8, "cty"], shade=True, color="orange", label="Cyl=8", alpha=.7)
# Decoration
plt.title('Density Plot of City Mileage by n_Cylinders', fontsize=22)
plt.legend()
plt.show()
这是圆形条形图的代码。
import numpy as np
import matplotlib.pyplot as plt
#~~~~~~~~~~~Test~~~~~~~#
import pandas as pd
import seaborn as sns
# Import Data
df = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")
#~~~~~~~~~~~Test~~~~~~~#
N = 80
bottom = 8
max_height = 4
theta = np.linspace(0.0, 2 * np.pi, N, endpoint=False)
radii = max_height*np.random.rand(N)
width = (2*np.pi) / N
ax = plt.subplot(111, polar=True)
bars = ax.bar(theta, radii, width=width, bottom=bottom)
# Use custom colors and opacity
for r, bar in zip(radii, bars):
bar.set_facecolor(plt.cm.jet(r / 10.))
bar.set_alpha(0.8)
plt.show()
我不确定圆形条形图代码中是否有任何相关内容,我只是在网上找到它作为圆形设计的参考框架。最终代码将与密度图非常相似,以几乎相同的方式获取数据(当前数据只是虚拟数据,但概念相同)。
我从来没有matplotlib
和seaborn
以前一起工作过,所以不确定我的目标是否可行。另外,我知道圆形密度图可能不是共享数据的最佳或最实用的选择,但在这种情况下,圆形设计更为重要。
解决方案
理论上,您可以将轴的投影设置为"polar"
,然后它将起作用:
x = np.random.vonmises(0, 2, 100)
f, ax = plt.subplots(subplot_kw=dict(projection='polar'))
sns.kdeplot(x)
但这并不是真正的圆形密度,因为要计算您需要使用 von mises 内核,而不是包裹到极坐标的高斯。不幸的是,我认为您需要自己计算圆形密度,然后将其绘制为一条线。
推荐阅读
- javascript - 如何从请求中返回响应(post | get)?
- jquery - 灯箱暂停按钮后重新加载多个 iframe 并导致所有 iframe 仅显示一个视频
- vue.js - vuex最多可以存储多少数据?
- android - 如何在 Android 上的物理键盘的 .kcm 文件中组合 Unicode 字符?
- linux - While循环性能:极慢
- node.js - Adding multiple Authorization to the same routes in nodejs, express and jwt
- c# - 如何在 WebAPI 中读取上传的文本文件中的流编码
- apache - 将子域重定向到主域
- sql - SELECT MAX() of Column, DATE Column and group by ID
- javascript - getElementsByClassName().classList.remove() 返回未定义