python - 使用 matplotlib 和 seaborn 创建圆形密度图

标签 python matplotlib seaborn

我正在尝试创建以下两张图片的组合。

Density Plot

Circular Bar Plot

基本上我想要密度图的设计,但围绕一个圆而不是正常的 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()

我不确定圆形条形图代码中是否有任何相关内容,我只是在网上找到它作为圆形设计的引用框架。最终代码将与密度图非常相似,以几乎相同的方式获取数据(当前数据只是虚拟数据,但概念相同)。

我以前从未使用过 matplotlibseaborn,所以不确定我的目标是否可行。此外,我知道圆形密度图可能不是共享数据的最佳或最实用的选择,但圆形设计在这种情况下更为重要。

最佳答案

理论上,您可以将坐标轴的投影设置为"polar",然后它将起作用:

x = np.random.vonmises(0, 2, 100)
f, ax = plt.subplots(subplot_kw=dict(projection='polar'))
sns.kdeplot(x)

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

关于python - 使用 matplotlib 和 seaborn 创建圆形密度图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62185125/

相关文章:

python - 异步 getNext 超出表时出错

python - timeit 的奇怪结果

python - matplotlib - pandas - 子图中的 twinx 轴没有 xlabel 和 xticks

python - Seaborn 箱线图,所有箱子颜色相同

python - 在 Vim 中基于缩进级别标记 block

python - 使用 Sympy 方程式绘图

python - 创建一个引用计数的图形

python - 使用 "Pandas"和 "Seaborn"在 PyCharm 中键入错误

python - 如何从 pandas 字符串列创建箱线图

python - 分割数据集以解决分类问题的正确程序是什么?