使用Matplotlib和Seaborn创建圆形密度图

5
我正在尝试创建下面两张图片的组合。 密度图 环形条形图 基本上,我想要密度图的设计,但是在一个圆形周围而不是普通的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,因此不确定我所追求的是否可行。此外,我知道圆形密度图可能不是共享数据的最佳或最实用选择,但在这种情况下,圆形设计更为重要。
1个回答

3
理论上,您可以将坐标轴的投影设置为"polar",然后它就能正常工作:
x = np.random.vonmises(0, 2, 100)
f, ax = plt.subplots(subplot_kw=dict(projection='polar'))
sns.kdeplot(x)

但是这不会真正成为一个圆形密度,因为要计算这个密度,您需要使用von mises核而不是高斯核,该核已转换为极坐标。不幸的是,我认为您需要自己计算圆形密度,然后将其绘制为一条线。


请参考 https://stats.stackexchange.com/q/608370/76901 上的评论以了解更多信息 - 显然不一定需要使用 von Mises,尽管如果 Seaborn 完全支持它,我肯定会使用它。 - Reinderien
那个回答似乎与核密度估计无关,所以我不确定它在这里有多少适用性。 - mwaskom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接