关于#python#的问题,请各位专家解答!

如何制作百分比气泡图,该气泡图实现除了X轴、Y轴、气泡大小、气泡颜色等四个维度的信息外同时每个气泡由多种颜色组成,每个气泡的每种颜色反应一定比例或者每个气泡能反映两种结局的不同比例关系如临床研究中一种干预措施的效果是有效还是无效,我想用python或者R语言

python做容易点,matplotlib可以做你要的气泡图,需要讲解可以私我

img

import matplotlib.pyplot as plt
import numpy as np

x = np.random.rand(50)
y = np.random.rand(50)
sizes = np.random.randint(5, 50, 50)
colors = np.random.rand(50)

cmap = plt.get_cmap('coolwarm')
normalize = plt.Normalize(vmin=min(colors), vmax=max(colors))
colors_map = cmap(normalize(colors))

normalize_sizes = plt.Normalize(vmin=min(sizes), vmax=max(sizes))
sizes_map = normalize_sizes(sizes)

fig, ax = plt.subplots()
scatter = ax.scatter(x, y, s=sizes_map, c=colors_map)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_title('Bubble chart')
cbar = plt.colorbar(scatter)
cbar.set_label('Color')
plt.show()



引用chatgpt部分指引作答:

img

要制作带有多种颜色的百分比气泡图,您可以使用Python中的matplotlib库来实现。以下是一个简单的示例代码,可以帮助您开始制作这样的图表:

import matplotlib.pyplot as plt
import numpy as np

# 示例数据
x = np.random.rand(10)  # X轴数据
y = np.random.rand(10)  # Y轴数据
sizes = np.random.randint(100, 1000, size=10)  # 气泡大小
success_rates = np.random.uniform(0, 1, size=10)  # 成功率,范围在0到1之间

# 创建绘图对象
fig, ax = plt.subplots()

# 绘制气泡图
scatter = ax.scatter(x, y, s=sizes, alpha=0.5)

# 添加颜色
for i in range(len(x)):
    success_rate = success_rates[i]
    non_success_rate = 1 - success_rate
    
    # 计算气泡颜色
    bubble_color = [(success_rate, 0, non_success_rate)]
    
    # 绘制气泡
    ax.scatter(x[i], y[i], s=sizes[i], c=bubble_color, alpha=0.5)

# 显示图表
plt.show()

这段代码创建了一个带有随机数据的气泡图,其中:

x和y是X轴和Y轴的数据,可以根据您的需求进行替换。
sizes是气泡的大小,可以根据您的需求进行调整。
colors是气泡的颜色,使用RGB值表示。在这个示例中,我们使用np.random.rand(10, 3)生成了10个随机的颜色。
alpha参数用于设置气泡的透明度。
您可以根据自己的数据和需求进行适当的修改,以创建符合您要求的气泡图。

用matplotlib 库做,给你个完整例子你试试。

import matplotlib.pyplot as plt
import numpy as np

# 准备数据
x = np.random.rand(50)
y = np.random.rand(50)
sizes = np.random.randint(50, 300, size=50)
colors = ['red', 'blue', 'yellow'] * 16  # 将三种颜色轮流分配给每个气泡
ratios = np.random.rand(150).reshape((50, 3))  # 每个气泡有三种颜色,对应三个比例

# 绘制气泡图
fig, ax = plt.subplots()
for i in range(len(x)):
    ax.scatter(x[i], y[i], s=sizes[i], edgecolors='gray', alpha=0.8, c=colors[i], linewidth=2)
    for j in range(3):
        proportion = ratios[i][j] * 100
        ax.annotate(f'{proportion:.0f}%', (x[i], y[i]), fontsize=8)
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_title('百分比气泡图')

plt.show()

在Python和R语言中,你可以使用各自的数据可视化库来创建百分比气泡图。以下是分别使用Python的matplotlib库和R语言的ggplot2库的示例代码:

Python示例代码(使用matplotlib库):

import matplotlib.pyplot as plt

# 样本数据
labels = ['A', 'B', 'C', 'D', 'E']
x = [1, 2, 3, 4, 5]
y = [0.3, 0.5, 0.2, 0.7, 0.4]
sizes = [30, 50, 20, 70, 40]
colors = ['red', 'blue', 'green', 'yellow', 'orange']

# 创建百分比气泡图
fig, ax = plt.subplots()
scatter = ax.scatter(x, y, s=sizes, c=colors, alpha=0.7)

# 设置轴标签和标题
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_title('百分比气泡图')

# 添加图例
legend_elements = [plt.scatter([], [], s=size, c=color, label=label) for size, color, label in zip(sizes, colors, labels)]
ax.legend(handles=legend_elements, title='标签')

# 显示图形
plt.show()

R语言示例代码(使用ggplot2库):

library(ggplot2)

# 样本数据
labels <- c('A', 'B', 'C', 'D', 'E')
x <- c(1, 2, 3, 4, 5)
y <- c(0.3, 0.5, 0.2, 0.7, 0.4)
sizes <- c(30, 50, 20, 70, 40)
colors <- c('red', 'blue', 'green', 'yellow', 'orange')

# 创建百分比气泡图
df <- data.frame(x=x, y=y, sizes=sizes, colors=colors)
p <- ggplot(df, aes(x=x, y=y, size=sizes, fill=colors)) +
  geom_point(shape=21, alpha=0.7) +
  scale_size_continuous(range=c(3, 10)) +
  labs(x='X轴', y='Y轴', title='百分比气泡图') +
  guides(size=FALSE, fill=guide_legend(title='标签'))

# 显示图形
print(p)

以上代码示例中,你可以根据实际情况调整数据和其他图形参数来满足你的需求。通过设置sizes来控制气泡的大小,通过设置colors来控制气泡的颜色。你可以根据不同的比例或结果,为每个气泡指定一个或多个颜色,以反映不同的关系。

py实现

import pandas as pd
import numpy as np
import matplotlib as mpl
from matplotlib import cm
import matplotlib.pyplot as plt
import seaborn as sns

data_1 = pd.read_csv('./product.csv')
data_1.head()

#确定 product 种类个数
cate_count = np.unique(data_1['product_lable'])

#根据 product 种类个数,确定色带颜色
#这里用到了列表生成式
colors = [plt.cm.tab10(i/float(len(cate_count)-1)) for i in range(len(cate_count))]

#生成画布
#dpi 参数表示清晰度
fig = plt.figure(figsize=(10,8), dpi=120)
#开始循环作图
for i, product_lable in enumerate(cate_count):
    plt.scatter('temperature','rainfall', data=data_1.loc[data_1.product_lable == product_lable,:]
                #根据 yield 确定气泡大小。
                , s = 'yield'
                #使用颜色,由于参数 c 接受一维数组,所以需要转化,否则会出警告
                , c= np.array(colors[i]).reshape(1,-1)
                #直接使用循环的 product 遍历的值作为本次循环的标签
                , label=str(product_lable)
                #将散点边缘颜色改成本次循环的颜色,否则默认是黑边
                , edgecolors = np.array(colors[i]).reshape(1,-1)
                #调整散点透明度
                , alpha = 0.65
               )
plt.legend(markerscale=0.2,bbox_to_anchor=(1.05, 0), loc=3, borderaxespad=0)
plt.xlabel('temperature')
plt.ylabel('rainfall')
plt.show()


可以使用python的Matplotlib库和Seaborn库来实现,下面是示例

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 创建数据
np.random.seed(10)
n = 50
x = np.random.rand(n)
y = np.random.rand(n)
size = np.random.randint(50, 500, n)

color1 = np.random.rand(n)
color2 = 1 - color1

# 创建数据框
data = pd.DataFrame({'x': x, 'y': y, 'size': size, 'color1': color1, 'color2': color2})

# 绘制多颜色百分比气泡图
fig, ax = plt.subplots()
sns.scatterplot(x='x', y='y', data=data, size='size', sizes=(50, 500), hue='color1',
                palette=['#ff6666', '#66b3ff'], legend=False, alpha=0.7)

# 添加图例
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, ['color1', 'color2'], loc='lower right', title='Color Legend')

# 设置坐标轴范围
ax.set_xlim([0, 1])
ax.set_ylim([0, 1])

# 添加标题和轴标签
ax.set_title('Multi-colored Bubble Chart')
ax.set_xlabel('X Axis')
ax.set_ylabel('Y Axis')

# 显示图像
plt.show()

可以使用Python中的matplotlib库制作百分比气泡图,代码如下,你看下是否符合你的要求,不符合的话,我再给你修改下:

import matplotlib.pyplot as plt  
  
# 创建数据  
x = [1, 2, 3, 4]  
y = [10, 8, 6, 4]  
size = [20, 30, 40, 50]  
colors = ['red', 'green', 'blue', 'yellow']  
  
# 创建子图  
fig, ax = plt.subplots()  
  
# 绘制气泡图  
ax.scatter(x, y, s=size, c=colors)  
  
# 设置x轴和y轴标签  
ax.set_xlabel('X Label')  
ax.set_ylabel('Y Label')  
  
# 设置标题  
ax.set_title('Percentage Bubble Chart')  
  
# 显示图形  
plt.show()

这个意思是吧

img

数据我自己造的

img


代码
字体文件,你可以自己找一下


import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r'PingFang Bold.ttf', size=14)
# 读取数据集
df = pd.read_csv('data.csv')
# 计算每个气泡中每种颜色的比例
percentages = df[['color1_ratio', 'color2_ratio']].to_numpy()
# 将比例转化为大小
bubble_sizes = np.sum(percentages, axis=1) * 1000
# 将每种颜色的比例分配到对应的大小中
bubble_colors = []
for i in range(len(percentages)):
    color1_size = bubble_sizes[i] * percentages[i][0]
    color2_size = bubble_sizes[i] * percentages[i][1]
    bubble_colors.append([color1_size, color2_size])
# 设置绘图参数
fig, ax = plt.subplots(figsize=(10, 8))

# 绘制气泡图
for i in range(len(df)):
  x = df.iloc[i]['x_axis']
  y = df.iloc[i]['y_axis']
  color1_size = bubble_colors[i][0]
  color2_size = bubble_colors[i][1]
  color1 = df.iloc[i]['color1']
  color2 = df.iloc[i]['color2']
  ax.scatter(x, y, s=color1_size, alpha=0.7, c=color1, edgecolors='none')
  ax.scatter(x, y, s=color2_size, alpha=0.7, c=color2, edgecolors='none')
# 设置图形标题和轴标签
ax.set_title('百分比气泡图', fontproperties=font)
ax.set_xlabel('X轴', fontproperties=font)
ax.set_ylabel('Y轴', fontproperties=font)
plt.show()





如有帮助给个采纳谢谢

python看下,

import matplotlib.pyplot as plt
import numpy as np
 # 生成一些随机数据
x = np.random.rand(50)
y = np.random.rand(50)
size = np.random.randint(100, 1000, 50)
color1 = np.random.rand(50)
color2 = 1 - color1
 # 创建一个颜色映射,用于为每个气泡指定多种颜色
cmap = plt.cm.get_cmap('RdBu')
colors = cmap(np.linspace(0, 1, 2))
 # 创建百分比气泡图
fig, ax = plt.subplots()
scatter = ax.scatter(x, y, s=size, c=[colors[0] if c1 > c2 else colors[1] for c1, c2 in zip(color1, color2)])
 # 为颜色创建图例
legend1 = ax.legend(*scatter.legend_elements(), loc="lower left", title="Colors")
ax.add_artist(legend1)
 # 设置坐标轴标签和标题
ax.set_xlabel('X-axis')
ax.set_ylabel('Y-axis')
ax.set_title('Percentage Bubble Chart with Multiple Colors')
 # 显示图形
plt.show()


测试结果:

img


如有帮助,还请点个赞,你如果跑不起来,记得私聊我哦