如何在 Python 的 plotnine / matplotlib 中绘制匹配的填充和空标记?

How to plot matching filled and empty markers in Python's plotnine / matplotlib?

我正在使用 Python 的 plotnine 包来绘制一些分组数据,类似于在 R 的 ggplot2 包中所做的。到目前为止,我是按颜色和形状分组的。现在,我想另外绘制 填充与未填充 shapes/markers。由于 plotnine's shapes are based on matplotlib's markers,我找不到任何匹配的标记对,例如,未填充与填充的正方形、圆形或三角形...

这是我的代码,包括。一些示例数据和当前图:

import pandas as pd
import numpy as np
from plotnine import *

# create data
df = pd.DataFrame({
        'Data': [x for x in ['Data 1', 'Data 2'] for i in range(6)],
        'Group': ['G1', 'G1', 'G2', 'G2', 'G3', 'G3'] * 2,
        'Method': ['M1', 'M2'] * 6,
        'value_1': np.random.rand(12),
        'value_2': np.random.rand(12)
})

# plot
(
ggplot(df, aes(x = 'value_1', y = 'value_2', color = 'Method', shape = 'Group')) +
geom_point(size = 5, alpha = 0.75) +
scale_x_continuous(name = 'Value 1') +
scale_y_continuous(name = 'Value 2') +
scale_color_manual(values = ['blue', 'green'] * 3) +
facet_grid('~Data') +
theme_bw() +
theme(axis_title_x = element_text(size = 12),
      axis_text_x = element_text(size = 10, angle = 45),
      axis_title_y = element_text(size = 12),
      axis_text_y = element_text(size = 10),
      strip_text_x = element_text(size = 10),
      legend_title = element_text(size = 12),
      legend_text = element_text(size = 10))
)

我想要的是方法 1 中的所有标记都已填充(就像现在一样),而方法 2 中的所有标记都未填充(或条纹或 s.th。否则)。其他一切都应该保持原样。不知怎的,我没能到达那里...

非常感谢任何帮助!

如果您想获得 Methed 2 的未填充标记,有一个解决方法。只需添加一个 fill 映射并指定 方法 2 的填充颜色为透明(使用 RGBA 字符串将 alpha 设置为零)。

(
ggplot(df, aes(x = 'value_1', y = 'value_2', shape = 'Group',color='Method', fill='Method')) +  # Add fill mapping
geom_point(size = 5, alpha = 0.75) +
scale_x_continuous(name = 'Value 1') +
scale_y_continuous(name = 'Value 2') + 
scale_fill_manual(values = ['blue', '#ffffff00'] * 3) +  # Add this
scale_color_manual(values = ['blue', 'green'] * 3) +
facet_grid('~Data') +
theme_bw() +
theme(axis_title_x = element_text(size = 12),
      axis_text_x = element_text(size = 10, angle = 45),
      axis_title_y = element_text(size = 12),
      axis_text_y = element_text(size = 10),
      strip_text_x = element_text(size = 10),
      legend_title = element_text(size = 12),
      legend_text = element_text(size = 10))
)

这是得到的图: