You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在基于Jetpack Compose的Android应用中使用Lets-Plot?

在Jetpack Compose Android应用中使用Lets-Plot的可行方案

一、应用模块build.gradle.kts依赖配置

将以下配置添加到app模块的build.gradle.kts文件中:

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

android {
    namespace = "com.example.letsplotdemo"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.example.letsplotdemo"
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"

        // 适配so库架构,避免找不到.so文件的问题
        ndk {
            abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64")
        }
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
    buildFeatures {
        compose = true
    }
    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.11"
    }
}

dependencies {
    // Jetpack Compose基础依赖
    implementation("androidx.core:core-ktx:1.12.0")
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0")
    implementation("androidx.activity:activity-compose:1.8.2")
    implementation(platform("androidx.compose:compose-bom:2024.02.00"))
    implementation("androidx.compose.ui:ui")
    implementation("androidx.compose.ui:ui-graphics")
    implementation("androidx.compose.ui:ui-tooling-preview")
    implementation("androidx.compose.material3:material3")

    // Lets-Plot Compose Android依赖(自动包含所需.so库)
    implementation("org.jetbrains.lets-plot:lets-plot-compose-android:4.2.0")
}

二、MainActivity.kt极简示例

以下是生成基础散点图的Compose示例:

package com.example.letsplotdemo

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier
import org.jetbrains.letsPlot.Geom
import org.jetbrains.letsPlot.ggplot
import org.jetbrains.letsPlot.label.ggtitle
import org.jetbrains.letsPlot.letsPlot
import org.jetbrains.letsPlot.intern.layer.geom.PointAesthetics
import org.jetbrains.letsPlot.compose.LetsPlotCompose

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MaterialTheme {
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    // 准备绘图数据
                    val data = mapOf(
                        "x" to listOf(1, 2, 3, 4, 5),
                        "y" to listOf(3, 1, 4, 1, 5)
                    )

                    // 创建Plot对象
                    val plot = letsPlot(data) +
                            Geom.point(PointAesthetics(color = "blue", size = 5.0)) +
                            ggtitle("Jetpack Compose + Lets-Plot 示例")

                    // 在Compose中渲染绘图
                    LetsPlotCompose(plot = plot, modifier = Modifier.fillMaxSize())
                }
            }
        }
    }
}

三、常见问题解决

  • lets-plot-compose-android使用方法:核心是通过LetsPlotCompose组件将Lets-Plot生成的Plot对象嵌入到Compose布局中,传入plot参数和布局修饰符即可完成渲染。
  • 本地.so库找不到:当前版本的lets-plot-compose-android依赖已自动包含各架构的预编译.so文件,无需手动添加。只需在defaultConfig中配置ndk.abiFilters适配主流架构即可。
  • ggsave导致应用崩溃:Android端无法直接使用桌面版的ggsave方法,需改用Android平台的文件保存逻辑。可以通过LetsPlotCompose的onPlotCreated回调获取绘图的Bitmap,再通过Android文件API保存:
    LetsPlotCompose(
        plot = plot,
        modifier = Modifier.fillMaxSize(),
        onPlotCreated = { bitmap ->
            // 这里处理Bitmap保存逻辑,例如保存到相册(需申请存储权限)
            // val outputStream = contentResolver.openOutputStream(contentUri)
            // bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream)
            // outputStream?.close()
        }
    )
    

内容的提问来源于stack exchange,提问作者PsyToolkit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 06:06:06